티스토리 뷰
반응형
해당 글의 소스코드는 링크 걸어 두었습니다.
이전 글에서 넘어와 Post를 알아보도록 하자.
Post로는 조금 더 복잡한 예제를 찾아봤다.
그래도 복잡하다 해봤자 request나 response 타입이 좀 더 복잡할 뿐이다.
앞선 예제보다 조금더 복잡해보이지만 변수 묶음인 keywordGroups는 객체로 만들어주면 되고
나머지는 예제에 나와있는 자료형으로 해주면 된다.
DatalabTotalSearchRequest.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DatalabTotalSearchRequest {
private String startDate;
private String endDate;
private String timeUnit;
private List<KeywordGroup> keywordGroups;
private String device;
private String gender;
private List<String> ages;
}
KeywordGroup.java
@Data
public class KeywordGroup{
private String groupName;
private List<String> keywords = new ArrayList<>();
public KeywordGroup setGroupName(String groupName){
this.groupName = groupName;
return this;
}
public KeywordGroup addKeywords(String keyword){
keywords.add(keyword);
return this;
}
}
keywordGroups는 응답 객체에서도 쓰이기 때문에 따로 분리해서 객체로 만들어주었다.
아래는 만들기 편하게 builder처럼(?) 만들어주었다.
그리고 응답의 경우에는
다음과 같은 spec을 볼 수 있고,
DatalabTotalSearchResponse.java
@Data @ToString
@NoArgsConstructor
@AllArgsConstructor
public class DatalabTotalSearchResponse {
private String startDate;
private String endDate;
private String timeUnit;
private List<Result> results;
@ToString
@Data
public static class Result{
private String title;
private List<String> keywords;
private List<DataObject> data;
@ToString
@Data
public static class DataObject{
private String period;
private String ratio;
}
}
}
특이한 점은 Result안에도 data라는 객체를 넣어야 한다는 점이다.
마지막으로는 앞서 Get방식과 거의 동일하게 Post 통신을 구현해주면 된다.
@Component
public class NaverDatalabClient {
@Value("${naver.client.datalab.id}")
private String id;
@Value("${naver.client.datalab.secret}")
private String passwd;
@Value("${naver.url.datalab.total}")
private String url;
public static<T> ResponseEntity<T> search(
Object request,
ParameterizedTypeReference<T> responseType,
String url, String id, String passwd) throws JsonProcessingException{
URI uri = UriComponentsBuilder.fromUriString(url)
.build().encode().toUri();
HttpHeaders header = getHttpHeaders(id, passwd, MediaType.APPLICATION_JSON);
String params = new ObjectMapper().writeValueAsString(request);
HttpEntity<String> httpEntity = new HttpEntity<>(params, header);
var responseEntity = new RestTemplate().exchange(
uri,
HttpMethod.POST,
httpEntity,
responseType
);
return responseEntity;
}
public static HttpHeaders getHttpHeaders(String id, String passwd, MediaType contentType){
HttpHeaders header = new HttpHeaders();
header.set("X-Naver-Client-Id", id);
header.set("X-Naver-Client-Secret", passwd);
header.setContentType(contentType);
return header;
}
public DatalabTotalSearchResponse searchDatalab(DatalabTotalSearchRequest request) throws JsonProcessingException{
var responseType = new ParameterizedTypeReference<DatalabTotalSearchResponse>() {};
var responseEntity = search(request, responseType, url, id, passwd);
return responseEntity.getBody();
}
}
Get방식에서 대부분을 다뤘기에 조금 다른 부분만 언급하도록 하자.
String params = new ObjectMapper().writeValueAsString(request);
HttpEntity<String> httpEntity = new HttpEntity<>(params, header);
요청 값을 String으로 바꾼 뒤에 HttpEntity에 넣어준다. 나머지는 Get방식과 거의 동일하다.
호출하는 Test를 만들어보자
{
"startDate": "2017-01-01",
"endDate": "2017-04-30",
"timeUnit": "month",
"keywordGroups": [
{
"groupName": "한글",
"keywords": [
"한글",
"korean"
]
},
{
"groupName": "영어",
"keywords": [
"영어",
"english"
]
}
],
"device": "pc",
"ages": [
"1",
"2"
],
"gender": "f"
}
네이버에서 제공해주는 예제는 다음과 같다.
@Autowired
NaverDatalabClient naverDatalabClient;
@Test
void searchTest() throws JsonProcessingException{
DatalabTotalSearchRequest request = new DatalabTotalSearchRequestBuilder()
.setStartDate("2017-01-01")
.setEndDate("2017-04-30")
.setTimeUnit("month")
.addKeywordGroups(new KeywordGroup().setGroupName("한글").addKeywords("한글").addKeywords("korean"))
.addKeywordGroups(new KeywordGroup().setGroupName("영어").addKeywords("영어").addKeywords("english"))
.setDevice("pc")
.addAge("1").addAge("2")
.setGender("f")
.build();
String params = new ObjectMapper().writeValueAsString(request);
System.out.println("request:" + params);
DatalabTotalSearchResponse resposne = naverDatalabClient.searchDatalab(request);
String res = new ObjectMapper().writeValueAsString(resposne);
System.out.println("response: " + res);
}
위처럼 나의 경우에는 Builder를 만들어서 조금 편하게 넣어 주었다.
그리고 다음처럼 결과값이 출력되면 완성이다.
request:{"startDate":"2017-01-01","endDate":"2017-04-30","timeUnit":"month","keywordGroups":[{"groupName":"한글","keywords":["한글","korean"]},{"groupName":"영어","keywords":["영어","english"]}],"device":"pc","gender":"f","ages":["1","2"]} response: {"startDate":"2017-01-01","endDate":"2017-04-30","timeUnit":"month","results":[{"title":"한글","keywords":["한글","korean"],"data":[{"period":"2017-01-01","ratio":"47.00101"},{"period":"2017-02-01","ratio":"53.23619"},{"period":"2017-03-01","ratio":"100"},{"period":"2017-04-01","ratio":"85.327"}]},{"title":"영어","keywords":["영어","english"],"data":[{"period":"2017-01-01","ratio":"40.0881"},{"period":"2017-02-01","ratio":"36.69942"},{"period":"2017-03-01","ratio":"52.11792"},{"period":"2017-04-01","ratio":"44.4595"}]}]}
728x90
반응형
'Back End > Spring' 카테고리의 다른 글
[Web MVC] API 만들기(request) - 2 (0) | 2023.03.06 |
---|---|
[Web MVC] API 만들기 - 1 (0) | 2023.03.06 |
[API] 3. Spring Boot - Naver API 호출(GET) (0) | 2022.09.01 |
[API] 2. Spring Boot API - Client / POST (0) | 2022.08.31 |
[API] 1. Spring Boot API - Client / GET (0) | 2022.08.31 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Firebase
- Container
- Front
- docker
- Data Engineering
- rhel
- API
- Producer
- broker
- apache kafka
- JPA
- cs
- feign client
- 리액트
- React
- spring
- frontend
- spring boot
- centos
- Linux
- K8S
- OS
- NextJS
- apache
- KAFKA
- Java
- consumer
- zookeeper
- logback
- 프론트엔드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
250x250