728x90
애플리케이션 정보 >
클라이언트 아이디 , 비밀번호 확인
여기에서 본인이 입력한 조건의 api 데이터를 확인 할 수 있다.
JSON IN java 라이브러리를 gradle의 dependencies에 추가
// https://mvnrepository.com/artifact/org.json/json
implementation group: 'org.json', name: 'json', version: '20220924'
NaverShopSearch.java
package com.gosari.repick_project.onlineshopping;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
@Component // @RequiredArgsConstructor 와 함께 사용할 경우 스프링이 자동으로 생성
public class NaverShopSearch {
public String search() {
String upcyclingshop = "업사이클링";
// https://openapi.naver.com/v1/search/shop.xml?query=%EC%A3%BC%EC%8B%9D&display=10&start=1&sort=sim
URI uri = UriComponentsBuilder.fromUriString("https://openapi.naver.com").path("/v1/search/shop")
.queryParam("query", upcyclingshop).queryParam("display", 50).queryParam("start", 1).queryParam("sort", "sim")
.encode().build().toUri();
RestTemplate restTemplate = new RestTemplate();
RequestEntity<Void> requestEntity = RequestEntity.get(uri).header("X-Naver-Client-Id", "Qdlklvrsmjdx6WV2d4ct")
.header("X-Naver-Client-Secret", "WluCbERIMc").build();
ResponseEntity<String> result = restTemplate.exchange(requestEntity, String.class);
String response = result.getBody();
return response;
}
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
naverShopSearch.search();
}
public List<OnlineshopItemDto> fromJSONtoItems(String result) {
// 문자열 정보를 JSONObject로 바꾸기
JSONObject rjson = new JSONObject(result);
System.out.println(rjson);
// JSONObject에서 items 배열 꺼내기
// JSON 배열이기 때문에 보통 배열이랑 다르게 활용해야한다.
JSONArray items = rjson.getJSONArray("items");
List<OnlineshopItemDto> itemDtoList = new ArrayList<>();
for (int i = 0; i < items.length(); i++) {
JSONObject itemJson = (JSONObject) items.get(i);
OnlineshopItemDto itemDto = new OnlineshopItemDto(itemJson);
itemDtoList.add(itemDto);
// item 중에서 필요한 항목만 꺼내기
//String title = itemJson.getString("title");
//String image = itemJson.getString("image");
//String link = itemJson.getString("link");
//int lprice = itemJson.getInt("lprice");
}
return itemDtoList;
}
}
· NaverShopSearch를 통해서 받아온 response를 OnlineshopItemDto로 바꾸기 필요 과정
- 문자열 정보를 JSONObject로 바꾸기
- JSONObject에서 items 배열 꺼내기
- items 배열이 담긴 JSONArray의 원소를 하나씩 JSONObject로 받기
- 받은 JSONObject로 ItemDto 생성 하기
NaverShopSearch 컴포넌트로 등록
- 컴포넌트: 스프링에게 필요할 때 갖다써라 권한을 주는 것
- 앞에서 만들어준 NaverShopSearch에 @Component를 선언
OnlineshopItemDto.java
package com.gosari.repick_project.onlineshopping;
import lombok.Getter;
import lombok.Setter;
import org.json.JSONObject;
@Getter
@Setter
public class OnlineshopItemDto {
private String title;
private String link;
private String image;
private int lprice;
public OnlineshopItemDto(JSONObject itemJson) {
this.title = itemJson.getString("title");
this.link = itemJson.getString("link");
this.image = itemJson.getString("image");
this.lprice = itemJson.getInt("lprice");
}
}
OnlineController.java
package com.gosari.repick_project.onlineshopping;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
@RequiredArgsConstructor // final 로 선언된 클래스를 자동으로 생성합니다.
@Controller
public class OnlineController {
private final NaverShopSearch naverShopSearch;
@GetMapping("/onlineshop/list")
public String getItems(Model model){
// ? 뒤에 오는 것을 쓰고 싶다면 @RequestParam
String resultString = naverShopSearch.search();
List<OnlineshopItemDto> itemDtos = naverShopSearch.fromJSONtoItems(resultString);
model.addAttribute("itemDtos", itemDtos);
return "onlineshop_list";
}
}
onlineshop_list.html
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.w3.org/1999/xhtml"
layout:decorate="~{layout}">
<div layout:fragment="content">
<table>
<tr>
<th>제목</th>
<th>이미지</th>
<th>가격</th>
</tr>
<tr th:each="items : ${itemDtos}">
<td>
<a th:href="${items.link}" target="_blank">
<span th:utext="${items.title}"></span>
</a>
</td>
<td>
<a th:href="${items.link}" target="_blank">
<img style="width: 30px;" th:src="${items.image}" alt="">
</a>
</td>
<td th:text="${items.lprice}"></td>
</tr>
</table>
</div>
<script layout:fragment="script">
</script>
</html>
th:utext로 <b>태그를 텍스트로 출력되지않게 출력했다.
참고 사이트 : [웹개발의 봄, Spring] 4주차 (2) - <나만의 셀렉샵> 서버 (tistory.com)
728x90
'Follow Work > SpringbootBoard' 카테고리의 다른 글
[Springboot] Jsoup 이용하여 웹 크롤링하기 (0) | 2022.10.02 |
---|---|
[Markdown] SimpleMDE Markdown Editor 적용 방법 (0) | 2022.09.28 |
[HTML CSS JS] 네비게이션 바 만들기 (0) | 2022.09.27 |
[API] 카카오maps API 목록으로 표출하기 오류 (0) | 2022.09.15 |
[API] 카카오maps API 사용하기 (0) | 2022.09.15 |