minlog
article thumbnail

 

 

[ 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();


}

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!