전에 만들어 둔 NaverShopSearch 클래스를 웹서비스에 사용할 있도록 수정해보자.
utils > NaverShopSearch.java
public class NaverShopSearch {
public String search() {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "mGmaVv5HUsl9XXf407tz");
headers.add("X-Naver-Client-Secret", "3mo1i3q5LN");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=cartier", HttpMethod.GET, requestEntity, String.class);
HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value();
String response = responseEntity.getBody();
System.out.println("Response status: " + status);
System.out.println(response);
return response;
}
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
naverShopSearch.search();
}
}
- 검색어 바꾸기
우선 검색어를 요구에 따라 바꿀 수 있어야 한다.
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "mGmaVv5HUsl9XXf407tz");
headers.add("X-Naver-Client-Secret", "3mo1i3q5LN");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=" + query, HttpMethod.GET, requestEntity, String.class);
HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value();
String response = responseEntity.getBody();
System.out.println("Response status: " + status);
System.out.println(response);
return response;
}
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
naverShopSearch.search("아이맥");
}
}
메인 메서드에서 보면 search메서드가 실행되는데 search 에 문자열로된 매개변수가 들어오변 매개변수가 가져온 검색어가 url의 query= 뒤에 따라오는 부분에 들어가 검색어가 되고 그에 따라 나온 검색 결과가 리턴된다.
● 검색 결과를 문자열에서 DTO로 바꾸기
- org.json 패키지 설치하기 ㄴ hongyuchan.tistory.com/30 <-링크
1. 문자열 정보를 JSONObject로 바꾸기
utils > NaverShopSearch.java
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
String result = naverShopSearch.search("아이맥");
JSONObject rjson = new JSONObject(result);
System.out.println(rjson); // 출력확인
}
- 작성 후 메인메서드 실행시
items라는 키값을 보면 []대괄호로 list 배열이고 JSONObject는 {} 중괄호로 시작하고 있다.
그럼 이걸 Json형태에 맞게끔 배열로 꺼내줘야 하는데 이때 사용하는 것이 JSONArray다.
- 2.
JSONObject에서 items 배열을 JSONArray 로 꺼내고 for 문 돌기
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
String result = naverShopSearch.search("아이맥");
JSONObject rjson = new JSONObject(result);
JSONArray items = rjson.getJSONArray("items");
for (int i=0; i<items.length(); i++){
JSONObject itemJson = items.getJSONObject(i);
System.out.println(itemJson);
}
}
출력해보면 이런식으로 JSONArray의 각JSONObject들이 나열된다.
이제 우측으로 넘겨보면 나오는 우리에게 필요한 데이터(image, lprice등) 를 꺼내오면 된다.
utils > NaverShopSearch.java
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
String result = naverShopSearch.search("아이맥");
JSONObject rjson = new JSONObject(result);
JSONArray items = rjson.getJSONArray("items");
for (int i=0; i<items.length(); i++){
JSONObject itemJson = items.getJSONObject(i);
System.out.println(itemJson);
String title = itemJson.getString("title");
String image = itemJson.getString("image");
int lprice = itemJson.getInt("lprice");
String link = itemJson.getString("link");
System.out.println(lprice);
}
}
이렇게 get으로 원하는 데이터만 뽑아지는 것을 확인했으면 이 데이터를 옮겨줄 Dto를 만들어준다.
models > ItemDto.java
@Getter
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");
}
}
Dto가 확인됐으면 다시 메인메서드로 돌아가서 Dto로 데이터를 실어나른다.
(ItemDto는 하나의 json이니까 ArrayList로 목록을 만들어 보내준다.)
utils > NaverShopSearch.java
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
String result = naverShopSearch.search("아이맥");
/*
JSONObject rjson = new JSONObject(result);
JSONArray items = rjson.getJSONArray("items");
List<ItemDto> itemDtoList = new ArrayList<>();
//ItemDto 의 목록을 가져와야 하니 리스트를 만들어준다..
for (int i=0; i<items.length(); i++){
JSONObject itemJson = items.getJSONObject(i);
ItemDto itemDto = new ItemDto(itemJson);
itemDtoList.add(itemDto);
}
*/
return itemDtoList;
}
위와같이 만들면 (블록해제시) 클라이언트에서 바로 사용가능하다.
다만 블록지정 되어있는 부분은 지속적으로 재사용 하기 위에 메서드로 따로 빼주는게 좋다.
그럼 이렇게
utils > NaverShopSearch.java 가 완성된다.
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "mGmaVv5HUsl9XXf407tz");
headers.add("X-Naver-Client-Secret", "3mo1i3q5LN");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=" + query, HttpMethod.GET, requestEntity, String.class);
HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value();
String response = responseEntity.getBody();
System.out.println("Response status: " + status);
System.out.println(response);
return response;
}
public List<ItemDto> fromJSONtoItems(String result){
JSONObject rjson = new JSONObject(result);
JSONArray items = rjson.getJSONArray("items");
List<ItemDto> itemDtoList = new ArrayList<>();
//ItemDto 의 목록을 가져와야 하니 리스트를 만들어준다.
for (int i=0; i<items.length(); i++){
JSONObject itemJson = items.getJSONObject(i);
ItemDto itemDto = new ItemDto(itemJson);
itemDtoList.add(itemDto);
}
return itemDtoList;
}
/*
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
String result = naverShopSearch.search("아이맥");
}//이제 메인메서드는 필요없으니 지워준다.
*/
}
이제 controller에서 두가지를 하면되는데 첫번쨰로 search메서드 호출하여 문자열로 받고
그걸 다시 fromJSONtoItems 메서드에 intput을 줘서 결과를 받은 다음에 그걸 돌려주면 클라이언트에서 자유롭게
정보를 받아볼 수있다.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ쿠ㅜㅜㅜ어렵다 다음은 서비스와
'나만의 select shop 만들기' 카테고리의 다른 글
HTML, Css, 이미지파일 (0) | 2020.12.07 |
---|---|
키워드로 상품 검색하기 - 네이버 API와 서비스 연결하기 (0) | 2020.12.07 |
org.json 패키지 설치하기 (0) | 2020.12.06 |
관심 상품 등록하기 (0) | 2020.12.06 |
관심 상품 조회하기 (0) | 2020.12.05 |