Spring

Spring 숙련 13 (RestTemplate의 Post) (RestTemplate의Exchange)

sehunbang 2024. 1. 28. 20:31

이번엔 RestTemplate의 Post 하는 방법을 알아 보겠습니다.

 

Client 서버 측에선

public ItemDto postCall(String query) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/post-call/{query}")
            .encode()
            .build()
            .expand(query)
            .toUri();
    log.info("uri = " + uri);

    User user = new User("Robbie", "1234");

    ResponseEntity<ItemDto> responseEntity = restTemplate.postForEntity(uri, user, ItemDto.class);

    log.info("statusCode = " + responseEntity.getStatusCode());

    return responseEntity.getBody();
}

이건에는 get 방식 때는 query 방식을 했지만 이번에는 @Pathvariable 방식으로

Post 는 Body 부분을 넘길수 있기 때문에.

// 요청 URL 만들기 

URI uri = UriComponentsBuilder 

.fromUriString("http://localhost:7070") 

.path("/api/server/post-call/{query}") 

.encode() 

.build() 

.expand(query) 

.toUri(); 

log.info("uri = " + uri); 

User user = new User("Robbie", "1234");    //객체를 만들기

ResponseEntity<ItemDto> responseEntity = restTemplate.postForEntity(uri, user, ItemDto.class); 

log.info("statusCode = " + responseEntity.getStatusCode()); 

return responseEntity.getBody();

 

 

Server 서버측

@PathVariable String query, 

@RequestBody UserRequestDto requestDto

 

컨트롤러

@GetMapping("/post-call/{query}")
public ItemDto postCall(String query) {
    return restTemplateService.postCall(query);
}

 

서비스

public Item postCall(String query, UserRequestDto userRequestDto) {
    System.out.println("userRequestDto.getUsername() = " + userRequestDto.getUsername());
    System.out.println("userRequestDto.getPassword() = " + userRequestDto.getPassword());
    return getCallObject(query);
}

 

public Item getCallObject(String query) {
    for (Item item : itemList) {
        if(item.getTitle().equals(query)) {
            return item;
        }
    }
    return null;
}

 

 

 

RestTemplate의Exchange

 

이전에는 URI 를 만들고 (POST 방식을 할때는 Body 부분을 넣고) 요청을 했는데.

 

요청 Header에 정보를 추가하고 싶다면?

 

Client 컨트롤러에 

@RequestHeader ("Authorization")

@GetMapping("/exchange-call")
public List<ItemDto> exchangeCall(@RequestHeader("Authorization") String token) {
    return restTemplateService.exchangeCall(token);
}

 

RestTemplateService.java

public List<ItemDto> exchangeCall(String token) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/exchange-call")
            .encode()
            .build()
            .toUri();
    log.info("uri = " + uri);

    User user = new User("Robbie", "1234");

    RequestEntity<User> requestEntity = RequestEntity
            .post(uri)
            .header("X-Authorization", token)
            .body(user);

    ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);

    return fromJSONtoItems(responseEntity.getBody());
}

 

RequestEntity<User> requestEntity = RequestEntity 

.post(uri) 

.header("X-Authorization", token) 

.body(user);

 

 

 

서버 측 

controller

@RequestHeader ("Authorization")

@PostMapping("/exchange-call")
public ItemResponseDto exchangeCall(@RequestHeader("X-Authorization") String token, @RequestBody UserRequestDto requestDto) {
    return itemService.exchangeCall(token, requestDto);
}

service 

public ItemResponseDto exchangeCall(String token, UserRequestDto requestDto) {
    System.out.println("token = " + token);
    System.out.println("requestDto.getUsername() = " + requestDto.getUsername());
    System.out.println("requestDto.getPassword() = " + requestDto.getPassword());

    return getCallList();
}

 

 

테스트: