nhnacademy-be6-code-quest / technology-sharing

기술 공유용 레포지터리
0 stars 0 forks source link

기술 공유 - 알라딘 api #1

Open InJunKangW opened 4 months ago

InJunKangW commented 4 months ago

알라딘 조회 api 사용법

당장 작동되게 구현은 했는데 지피티가 해준 게 대부분이라, 자세한 설명은 더 찾아보고 하겠습니다.

추후 수정 예정..

InJunKangW commented 4 months ago
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.nhnacademy.naver.BookDto;
import com.nhnacademy.naver.BookResponse;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

@slf4j
@controller
@RequestMapping("/test")
@requiredargsconstructor
public class AladinController {

private final RestTemplate restTemplate;

@GetMapping
public String test(Model model) throws JsonProcessingException {

    String rawString = "이해";   // 검색할 제목
    byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8);
    String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8); // 제목의 utf-8 인코딩된 값.

 //제목 검색 - 리스트 보기.
    URI uri = UriComponentsBuilder
            .fromUriString("http://www.aladin.co.kr")
            .path("/ttb/api/ItemSearch.aspx")
            .queryParam("TTBKey","ttbjasmine066220924001") // 알라딘 api client 키 값
            .queryParam("Query",utf8EncodedString)
            .queryParam("QueryType","Title")
            .encode()
            .build()
            .toUri();

/*
* Isbn13으로 책 검색.
* URI uri = UriComponentsBuilder
* .fromUriString("http://www.aladin.co.kr/")
* .path("/ttb/api/ItemLookUp.aspx")
* .queryParam("TTBKey","ttbjasmine066220924001")
* .queryParam("ItemId","9791193528174") //검색할 값. 해당 ISBN 13인 책만 나옴. title이랑 다르게 완전히 일치해야 하는 것 같습니다.
* .queryParam("ItemIdType", "ISBN13")  // 검색할 기준 . Title, ISBN, ISBN 13으로 가능.
* .encode()
* .build()
* .toUri();  
*/ 

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<String> responseEntity = restTemplate.exchange(RequestEntity.get(uri).build(), String.class);
    ObjectMapper objectMapper = new ObjectMapper();

    String responseBody = responseEntity.getBody();
    System.out.println("rep body : " + responseBody);

    XmlMapper xmlMapper = new XmlMapper();
    BookResponse bookResponse = xmlMapper.readValue(responseBody, BookResponse.class);

    List<BookDto> bookList = bookResponse.getBooks();
    System.out.println(bookList);

    model.addAttribute("bookList", bookList);
    return "test";
}
}

BookDto 클래스

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Data
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BookDto {
    private String title;
    private String link;
    private String cover;
    private String author;
    private String publisher;
    private String priceStandard;
    private String pubdate;
    private String priceSales;
    private String discount;
}

BookResponse 클래스

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.util.List;
import lombok.Data;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class BookResponse {
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "item")
    private List<BookDto> books;
}

view 페이지. (resource/template/view/test.html)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div th:each="book : ${bookList}">
<div th:text="'제목: ' + ${book.title}"></div>
    <div th:text="'정가' + ${book.priceStandard}"></div>

    <div th:text="'판매가(할인가) : ' +${book.priceSales}"></div>

    <img th:src="${book.cover}" alt="" width="200px" height="300px">
</div>
</body>
</html>