[ Spring Boot ] Server 연결 (1) Get/Post- UriComponentsBuilder · RestTemplate
API 서버에 요청하여 정보 가져오는 방법 다른 서버에 정보를 요청하는 방법은 RestTemplate, Apache Client ,WebClient,...등 의 방법이 있다. 스프링에서는 주로 RestTemplate 을 사용한다. 1 . API 서버가 어떤
jimin-log.tistory.com
Server 연결 (2) - 실제로 많이 사용되는 구조와 네이버 Api 연결해보기
1. POST 요청으로 API 데이터 가져오기 - header , resBody 형태
- 헤더의 값과 body의 값을 받을 수 있어야한다.
- 제네릭 형태로 데이터 객체 생성
Server (port : 9090)
📑Req.java
package com.example.server.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Req<T> {
private Header header;
private T resBody; // 계속 변경됨
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Header{
private String responseCode;
}
}
📑serverApiController.java
@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("entity :{}",entity.getBody());
log.info("user3 id:{} , user3 name:{}",userId,userName);
log.info("user3 authorization:{} , user3 customHeader:{}",authorization,customHeader);
log.info("client user: {}",user);
Req<User> response = new Req<>();
response.setHeader(
new Req.Header()
);
response.setResBody(user.getResBody());
return response;
}
Client (port : 8088)
📑Req.java
package com.example.client.dto;
public class Req<T> {
public Header header;
public 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 + '\'' +
'}';
}
}
@Override
public String toString() {
return "Req{" +
"header=" + header +
", body=" + resBody +
'}';
}
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;
}
}
📑RestTemplateService.java
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("jimin123");
userRequest.setAge(20);
//header
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","abcd")
.body(req);
RestTemplate restTemplate = new RestTemplate();
//new ParameterizedTypeReference<Req<UserResponse>>(){};
ResponseEntity<Req<UserResponse>> response
= restTemplate.exchange(requestEntity,new ParameterizedTypeReference<Req<UserResponse>>(){});
return response.getBody();
}
📑ApiController.java
@GetMapping("/GenericExchange")
public Req<UserResponse> postGenericExchange(){
return restTemplateService.genericExchange();
}
2. Naver Open Api 사용하기
API 공통 가이드 - Open API 가이드
API 공통 가이드 네이버 오픈API는 네이버 플랫폼의 기능을 외부 개발자가 쉽게 이용할 수 있게 웹 또는 SDK 형태로 공개한 기술들입니다. 네이버 오픈API로 활용할 수 있는 기술에는 네이버 로그인
developers.naver.com
1) 네이버 오픈 Api 사이트
- 오픈 Api 이용신청 후 사용이 가능하다.
- Documents > 서비스 Api에서 사용가이드를 확인하여 사용할 수 있다.
2) 검색 Api 사용 예시
- 먼저 코드 작성전 Api Tester로 데이터를 잘 받아 올수 있는지 확인 할 수 있다.
- Api 가이드에서 사용한 url 과 header에 들어가야하는 내가 신청한 애플리케이션의 Client ID와 Secret를 입력해준다.
3) 검색 Api 코드 작성 적용
@GetMapping("/naver")
public String naver(){
URI uri = UriComponentsBuilder
.fromUriString("https://openapi.naver.com")
.path("/v1/search/local.json")
.queryParam("query","갈비집")
.queryParam("display","10")
.queryParam("start","1")
.queryParam("sort","random")
.encode(Charset.forName("UTF-8")) // 요청한 인코딩값
.build().toUri();
log.info("uri{}",uri);
RestTemplate restTemplate = new RestTemplate();
//header 세팅 , get으로 요청하기 때문에 안에 들어가는 값은 Void
RequestEntity<Void> req = RequestEntity
.get(uri)
.header("X-Naver-Client-Id", "ejcG2iZX5lUBcHNinBWI")
.header("X-Naver-Client-Secret","4eEhLNfZ2Y")
.build();
// get > post exchange
ResponseEntity<String> result = restTemplate.exchange(req,String.class);
return result.getBody();
}
'BackEnd > Spring Boot' 카테고리의 다른 글
[ Spring Boot ] Thymeleaf (0) | 2023.03.25 |
---|---|
[ Spring Boot ] 로깅 SLF4J - @Slf4j (0) | 2023.03.23 |
[ Spring Boot ] Server 연결 (1) Get/Post- UriComponentsBuilder · RestTemplate (0) | 2023.03.12 |
[ Spring Boot ] Exception 예외 처리 방법 (0) | 2023.03.10 |
[ Spring ] Test Code - Controller 전체를 테스트하는 방법 (0) | 2023.03.09 |