반응형
URI 생성하는 방법: UriComponentsBuilder
expend()를 이용해서 uri상의 데이터를 추가한다.( , 를 추가하여 파라미터를 계속해서 추가해 줄 수 있다.)
// http://localhost:8081/api/server/user/{userId}/name/{userName}
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8081")
.path("api/server/user/{userId}/name/{userName}")
.encode()
.build()
// post 방식일 경우 PathVariable 값을 추가하는 방법: expand
.expand(100, "steve")
.toUri();
System.out.println(uri);
POST 방식으로 Server 호출하는 방법: RestTemplate
postForEntity을 이용하여 json 형식으로 반환 받는다.
// 진행 순서
// http body -> object -> object mapper -> json -> rest template -> http body json
UserRequest req = new UserRequest();
req.setName("steve");
req.setAge(10);
RestTemplate restTemplate = new RestTemplate();
// 응답을 어떻게 받을지 정한다.
ResponseEntity<UserResponse> response = restTemplate.postForEntity(uri, req, UserResponse.class);
client에서 호출하는 코드
package com.example.client.contoller;
import com.example.client.dto.UserResponse;
import com.example.client.service.RestTemplateService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/client")
public class ApiController {
private final RestTemplateService restTemplateService;
public ApiController(RestTemplateService restTemplateService) {
this.restTemplateService = restTemplateService;
}
@GetMapping("/hello")
public UserResponse getHello(){
// 서버로 호출
return restTemplateService.post();
}
}
Server URI를 호출하는 코드
package com.example.client.service;
import com.example.client.dto.UserRequest;
import com.example.client.dto.UserResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
@Service
public class RestTemplateService {
// get 방식
// http://localhost:8081/api/server/hello
// response
public UserResponse hello(){
// 주소 만들기: http://localhost:8081/api/server/hello
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8081")
.path("/api/server/hello")
// 주소에 값을 넣는 방법: queryParam
// http://localhost:8081/api/server/hello?name=steve&age=10
.queryParam("name", "steve")
.queryParam("age", 10)
.encode()
.build()
.toUri();
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate();
// client가 되어 해당url의 서버를 호출한다. (get 방식, string으로 반환)
// String result = restTemplate.getForObject(uri, String.class);
// ResponseEntity 형식으로 호출
//ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri, UserResponse.class);
System.out.println(result.getStatusCode()); // 200 OK
System.out.println(result.getBody()); // UserResponse(name=steve, age=10)
return result.getBody();
}
// post 방식
public UserResponse post(){
// http://localhost:8081/api/server/user/{userId}/name/{userName}
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8081")
.path("api/server/user/{userId}/name/{userName}")
.encode()
.build()
// post 방식일 경우 PathVariable 값을 추가하는 방법: expand
.expand(100, "steve")
.toUri();
System.out.println(uri);
// 진행 순서
// http body -> object -> object mapper -> json -> rest template -> http body json
UserRequest req = new UserRequest();
req.setName("steve");
req.setAge(10);
RestTemplate restTemplate = new RestTemplate();
// 응답을 어떻게 받을지 정한다. json
ResponseEntity<UserResponse> response = restTemplate.postForEntity(uri, req, UserResponse.class);
System.out.println(response.getStatusCode());
System.out.println(response.getHeaders());
System.out.println(response.getBody());
// String으로 반환되는 값 확인
ResponseEntity<String> response2 = restTemplate.postForEntity(uri, req, String.class);
System.out.println(response2.getStatusCode());
System.out.println(response2.getHeaders());
System.out.println(response2.getBody());
return response.getBody();
}
}
Server에서 데이터 받는 코드
@PathVariable을 이용해서 post로 전달된 데이터를 받는다.
package com.example.server.controller;
import com.example.server.dto.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("/hello")
public User hello(@RequestParam String name, @RequestParam int age){
User user = new User();
user.setName(name);
user.setAge(age);
return user;
}
@PostMapping("/user/{userId}/name/{userName}")
public User post(@RequestBody User user, @PathVariable int userId, @PathVariable String userName){
log.info("userId: {}, userName: {}",userId, userName );
log.info("client req: {}", user);
return user;
}
}
확인
client 로그
Server 로그
반응형
'Spring' 카테고리의 다른 글
Server to Server의 연결 - Naver API 사용 (0) | 2021.06.26 |
---|---|
Server to Server의 연결 - header 값 지정하는 방법 (0) | 2021.06.26 |
Server to Server의 연결 - get (0) | 2021.06.26 |
Exception 처리 (0) | 2021.06.19 |
Custom Validation (0) | 2021.06.19 |