naver 검색 API 예제
책 검색 서비스를 만들기 위해서 책 검색 API를 찾던 중 네이버 검색 API를 발견했다.
검색 API는 여러 종류에 검색 API를 제공하고 그 중 책 검색 API를 예제로 설명할 것이다. 사실 URL만 다르지 검색 API 모두 xml, json 구조는 모두 동일하고 아래와 같다.
XML : 기본 검색
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>Naver Open API - book ::'주식'</title> <link>http://search.naver.com</link> <description>Naver Search Result</description> <lastBuildDate>Mon, 26 Sep 2016 10:40:35 +0900</lastBuildDate> <total>20177</total><start>1</start><display>10</display> <item> <title>불곰의 <b>주식</b>투자 불패공식 (60개 매도종목 평균 수익률 62%)</title> <link>http://openapi.naver.com/l?AAAC3LSwqDMBSF4dXcDCV6YxsHGfiog6JIV1A0SYloGpumQnffFIQz+DnwvT7afwVcaigRqvofvIKiIcbrhzAhbIAlZG3c5NySPMdd+0Q6exxqOuKudBjnNdlMFO00K8AmpRzZKackiJSdGc8ZxZzSglix3vqhG6KVKPcis0vXX+k+vqXM2BLpDzHjEYWYAAAA</link> <image>http://bookthumb.phinf.naver.net/cover/108/346/10834650.jpg?type=m1&udate=20160902</image> <author>불곰 박선목</author> <price>16000</price> <discount>14400</discount> <publisher>부키</publisher> <pubdate>20160729</pubdate> <isbn>8960515523 9788960515529</isbn> <description>잘못된 <b>주식</b>투자 습관을 버리고, 절대로 지지 않는 투자법을 체득하다! </description> </item> ... </channel> </rss> | cs |
JSON : 상세 검색
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | { "lastBuildDate": "Tue, 10 Jan 2017 19:44:39 +0900", "total": 6374, "start": 1, "display": 5, "items": [ { "title": "<b>Java</b>의 정석 (최신 <b>Java</b> 8.0 포함)", "link": "http://book.naver.com/bookdb/book_detail.php?bid=10191151", "image": "http://bookthumb.phinf.naver.net/cover/101/911/10191151.jpg?type=m1&udate=20161124", "author": "남궁성", "price": "30000", "discount": "27000", "publisher": "도우출판", "pubdate": "20160127", "isbn": "8994492038 9788994492032", "description": "자바의 기초부터 실전활용까지 모두 담다!자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한" } } | cs |
API 문서 자체는 설명하지 않겠다. 여기를 참고 하자.
Object
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | public class NaverBook { private String lastBuildDate; private int total; private int start; private int display; private List<Item> items; // getter and setter @Override public String toString() { return "NaverBook{" + "lastBuildDate='" + lastBuildDate + '\'' + ", total=" + total + ", start=" + start + ", display=" + display + '}'; } public static class Item { private String title; private String link; private String image; private String author; private String price; private String discount; private String publisher; private String pubdate; private String isbn; private String description; // getter and setter @Override public String toString() { return "Item{" + "title='" + title + '\'' + ", link='" + link + '\'' + ", image='" + image + '\'' + ", author='" + author + '\'' + ", price='" + price + '\'' + ", discount='" + discount + '\'' + ", publisher='" + publisher + '\'' + ", pubdate='" + pubdate + '\'' + ", isbn='" + isbn + '\'' + ", description='" + description + '\'' + '}'; } } } | cs |
TEST
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 32 33 34 35 36 37 38 39 40 41 42 43 44 | public class SearchApiTest { private static final String CLIENT_ID = "input your client_id"; private static final String CLIENT_SECRET = "input your client_secret"; private static final String URL = "https://openapi.naver.com/v1/search/book_adv.json"; private HttpEntity<?> headers; private RestTemplate template = new RestTemplate(); @Before public void setUp() throws Exception { MultiValueMap<String, String> headerMap = new LinkedMultiValueMap<>(); headerMap.add("X-Naver-Client-Id", CLIENT_ID); headerMap.add("X-Naver-Client-Secret", CLIENT_SECRET); headerMap.add("Content-Type", MediaType.APPLICATION_JSON_VALUE); this.headers = new HttpEntity<>(headerMap); } @Test public void requestString() throws Exception { String url = URL + "?d_titl=java&display=5"; ResponseEntity<String> responseEntity = template.exchange(url, HttpMethod.GET, headers, String.class); assertThat(responseEntity).isNotNull(); String body = responseEntity.getBody(); assertThat(body).isNotNull(); } @Test public void requestJson() throws Exception { String url = URL + "?d_titl=java&display=5"; ResponseEntity<NaverBook> responseEntity = template.exchange(url, HttpMethod.GET, headers, NaverBook.class); assertThat(responseEntity).isNotNull(); NaverBook body = responseEntity.getBody(); assertThat(body).isNotNull(); assertThat(body.getDisplay()).isNotNull(); assertThat(body.getDisplay()).isEqualTo(5); assertThat(body.getLastBuildDate()).isNotNull(); assertThat(body.getStart()).isNotNull(); assertThat(body.getTotal()).isNotNull(); assertThat(body.getItems()).isNotNull().isNotEmpty(); assertThat(body.getItems().size()).isEqualTo(5); } } | cs |
Spring RestTemplate을 사용한 예제다.
출처 : https://blog.woniper.net/335?category=506090
'JAVA > Java' 카테고리의 다른 글
java isNumeric, isDigits, isNumber (0) | 2020.10.27 |
---|---|
[mybatis] foreach를 이용한 다중 insert (0) | 2020.09.07 |
java inner class (0) | 2020.09.07 |
AbstractList.add(E)는 쓸 수 없어! (0) | 2020.09.07 |
java8 stream match (0) | 2020.09.07 |
SuperTypeToken #2 TypeToken(ModelMapper)과 ParameterizedTypeReference(Spring) 차이 (0) | 2020.09.07 |
SuperTypeToken #1 TypeToken(ModelMapper)과 ParameterizedTypeReference(Spring) 사용법 (0) | 2020.09.07 |
HashMap.put의 return 객체는 무엇일까? (0) | 2020.09.07 |