반응형
아래와 같은 Json파일을 만들고자한다.
이러한 형태를 사용하는 이유는 json형식을 만드는 코드를 매번 작성할 필요없이 body 내용만을 변경하여 사용할 수있다.
{
"header":{
"responseCode": null
},
"resBody":{
"name": "steve",
"age": 10
}
}
클라이언트
Req.java
public class Req<T> {
private Header header;
private T resBody;
public static class Header {
private String responseCode;
public String getResponseCode() {
return responseCode;
}
public void setResponseCode(String responseCode) {
this.responseCode = responseCode;
}
@Override
public String toString() {
return "Header{" +
"responseCode='" + responseCode + '\'' +
'}';
}
}
public Header getHeader() {
return header;
}
public void setHeader(Header header) {
this.header = header;
}
public T getResBody() {
return resBody;
}
public void setResBody(T resBody) {
this.resBody = resBody;
}
@Override
public String toString() {
return "Req{" +
"header=" + header +
", body=" + resBody +
'}';
}
}
ApiController.java
import com.example.client.dto.Req;
import com.example.client.dto.UserResponse;
import com.example.client.service.RestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
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 {
@Autowired
private RestTemplateService restTemplateService;
public ApiController(RestTemplateService restTemplateService) {
this.restTemplateService = restTemplateService;
}
@GetMapping("hello3")
public Req<UserResponse> gethello3() {
return restTemplateService.genericExchange();
}
}
RestTemplateService.java
import com.example.client.dto.Req;
import com.example.client.dto.UserRequest;
import com.example.client.dto.UserResponse;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
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 {
// 커스텀헤더
public UserResponse exchange() {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/user/{userId}/name/{userName}")
.encode()
.build()
.expand(100, "steve")
.toUri();
System.out.println(uri);
UserRequest req = new UserRequest();
req.setName("steve");
req.setAge(10);
RequestEntity<UserRequest> requestEntity = RequestEntity
.post(uri)
.contentType(MediaType.APPLICATION_JSON)
.header("x-authorization", "abcd")
.header("custom-header", "fffff")
.body(req);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserResponse> response = restTemplate.exchange(requestEntity, UserResponse.class);
return response.getBody();
}
//Json형식 재사용
public Req<UserResponse> genericExchange() {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/user/{userId}/name/{userName}")
.encode()
.build()
.expand(100, "steve")
.toUri();
System.out.println(uri);
UserRequest userRequest = new UserRequest();
userRequest.setName("steve");
userRequest.setAge(10);
Req<UserRequest> req = new Req<>();
req.setHeader(new Req.Header());
req.setResBody(userRequest);
RequestEntity<Req<UserRequest>> requestEntity = RequestEntity
.post(uri)
.contentType(MediaType.APPLICATION_JSON)
.header("x-authorization", "abcd")
.header("custom-header", "fffff")
.body(req);
RestTemplate restTemplate = new RestTemplate();
// 제네릭 타입에는 클래스를 붙일수 없다. Req<UserResponse>.Class를 대체해 사용
// ResponseEntity<Req<UserResponse>> response 로 선언하였으므로
// new ParameterizedTypeReference<>(){} 로 사용해도 무관
ResponseEntity<Req<UserResponse>> response =
restTemplate.exchange(requestEntity, new ParameterizedTypeReference<Req<UserResponse>>() {
});
return response.getBody();
}
}
서버
Req.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Req<T> {
private Header header;
private T resBody;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Header {
private String responseCode;
}
}
User.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
}
ServerApiController.java
import com.example.server.dto.Req;
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 {
@PostMapping("/user/{userId}/name/{userName}")
public Req<User> post(
//HttpEntity<String> entity,
@RequestBody Req<User> user,
@PathVariable int userId,
@PathVariable String userName,
@RequestHeader("x-authorization") String authorization,
@RequestHeader("custom-header") String customHeader
) {
//log.info("req : {}", entity.getBody());
log.info("userId : {}, userName : {}", userId, userName);
log.info("authorization : {}, custom : {}", authorization, customHeader);
log.info("client req : {}", user);
Req<User> response = new Req<>();
response.setHeader(
new Req.Header()
);
response.setResBody(user.getResBody());
return response;
}
}
반응형
'Spring' 카테고리의 다른 글
[Spring] 네이버API활용 맛집검색 (0) | 2022.08.21 |
---|---|
[Spring] Swagger (0) | 2022.08.19 |
[Spring] Server to Server 통신 - POST (0) | 2022.08.19 |
[Spring] Server to Server 통신 - GET (0) | 2022.08.16 |
[Spring] Filter & Interceptor + 비동기 (0) | 2022.08.12 |
댓글