Spring

Spring 숙련 14 (Naver Open API)

sehunbang 2024. 1. 28. 21:37

네이버가 제공 하는 open API 들

https://developers.naver.com/products/intro/plan/plan.md

 

네이버 오픈 API 목록 - INTRO

네이버 오픈 API 목록 NAVER Developers - API 소개 네이버 오픈API 목록 및 안내입니다. 네이버 오픈 API 목록 API명 설명 호출제한 검색 네이버 블로그, 이미지, 웹, 뉴스, 백과사전, 책, 카페, 지식iN 등 검

developers.naver.com

 

 

 

 

1. 이 api 들을 사용하려면 로그인 하고 application 을 등록을 해야 합니다.

우리는 검색 API 를 할겁니다.

2. Client ID 랑 Client Secret(비번) 을 받고 이것일 사용 하여 Open API 요청을 합니다.

 

 

 

// 네이버 검색(API) 에 고나하여 조금 디테일하게 하자면.

https://developers.naver.com/docs/serviceapi/search/shopping/shopping.md#%EC%87%BC%ED%95%91

 

검색 > 쇼핑 - Search API

검색 > 쇼핑 쇼핑 검색 개요 개요 검색 API와 쇼핑 검색 개요 검색 API는 네이버 검색 결과를 뉴스, 백과사전, 블로그, 쇼핑, 웹 문서, 전문정보, 지식iN, 책, 카페글 등 분야별로 볼 수 있는 API입니다

developers.naver.com

 

우리는 JSON 방식으로 받을겁니다. 

https://openapi.naver.com/v1/search/shop.json

을 사용 하게 되겠습니다.

 

요청예 :

 

파라미터 :

 

//

Postman 으로 테스트

 

 

결과 :

 

 

 

 

Spring 으로 해보기 (Spring-RestTemplate-Client)

 

 

 

컨트롤러 :

@RestController
@RequestMapping("/api")
public class NaverApiController {

    private final NaverApiService naverApiService;

    public NaverApiController(NaverApiService naverApiService) {
        this.naverApiService = naverApiService;
    }

    @GetMapping("/search")
    public List<ItemDto> searchItems(@RequestParam String query)  {
        return naverApiService.searchItems(query);
    }
}

 

 서비스 :

@Slf4j(topic = "NAVER API")
@Service
public class NaverApiService {

    private final RestTemplate restTemplate;

    public NaverApiService(RestTemplateBuilder builder) {
        this.restTemplate = builder.build();
    }

    public List<ItemDto> searchItems(String query) {
        // 요청 URL 만들기
        URI uri = UriComponentsBuilder
                .fromUriString("https://openapi.naver.com")
                .path("/v1/search/shop.json")
                .queryParam("display", 15)
                .queryParam("query", query)
                .encode()
                .build()
                .toUri();
        log.info("uri = " + uri);

        RequestEntity<Void> requestEntity = RequestEntity
                .get(uri)
                .header("X-Naver-Client-Id", "Client-Id")
                .header("X-Naver-Client-Secret", "Client-Secret")
                .build();

        ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);

        log.info("NAVER API Status Code : " + responseEntity.getStatusCode());

        return fromJSONtoItems(responseEntity.getBody());
    }

    public List<ItemDto> fromJSONtoItems(String responseEntity) {
        JSONObject jsonObject = new JSONObject(responseEntity);
        JSONArray items  = jsonObject.getJSONArray("items");
        List<ItemDto> itemDtoList = new ArrayList<>();

        for (Object item : items) {
            ItemDto itemDto = new ItemDto((JSONObject) item);
            itemDtoList.add(itemDto);
        }

        return itemDtoList;
    }
}

 

// 요청 URL 만들기 URI uri = UriComponentsBuilder 

.fromUriString("https://openapi.naver.com"

.path("/v1/search/shop.json") 

.queryParam("display", 15)   // 15 개식 가져오겠다는 뜻

.queryParam("query", query) 

.encode() 

.build() 

.toUri(); 

log.info("uri = " + uri); 

RequestEntity<Void> requestEntity = RequestEntity 

.get(uri) 

.header("X-Naver-Client-Id", "Client-Id") // 발급 받은 Client-Id 넣어주면 됨

.header("X-Naver-Client-Secret", "Client-Secret")  // 발급 받은  Secret  넣어주면 됨

.build();

 

DTO :

@Getter
@NoArgsConstructor
public class ItemDto {
    private String title;
    private String link;
    private String image;
    private int lprice;

    public ItemDto(JSONObject itemJson) {
        this.title = itemJson.getString("title");
        this.link = itemJson.getString("link");
        this.image = itemJson.getString("image");
        this.lprice = itemJson.getInt("lprice");
    }
}

 

 

PostMan 으로 테스트 :

 

 

 

결과 :