xml openApi 이용하기

메타플랫폼대표
|2024. 7. 8. 12:17
반응형

https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EB%B8%94%EB%A1%9C%EA%B7%B8

 

검색 > 블로그 - Search API

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

developers.naver.com

 

오픈 api를 쉽게 사용하는 방법

 

https://www.postman.com/

 

Postman API Platform | Sign Up for Free

Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.

www.postman.com

 

 

 

 

Headers에 받은 api의 id와 pwd를 넣어준다.

 

 

 

 

local을 검색하면, 지역이 나온다.

 

 

 

json으로 조회할 수 있다.

 

 

 

 

naver 검색으로 xml 정보 가져오기

package util;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import xml.vo.ProductVo;

public class MySearchUtil {
	// 객체 생성 없이 바로 사용 가능
	public static List<ProductVo> search_shop(String p_name,int start,int display)
	{
		List<ProductVo> list = new ArrayList<ProductVo>();
		String clientId = "HSnvoBv";
		String clientSecret = "2XBh";

		try {
			p_name = URLEncoder.encode(p_name, "utf-8");
			String urlStr = String.format("https://openapi.naver.com/v1/search/shop.xml?query=%s&start=%d&display=%d",
					         p_name,start,display
					);

			URL url = new URL(urlStr);
			HttpURLConnection connection = (HttpURLConnection)url.openConnection();
			//발급받은 ID
			connection.setRequestProperty("X-Naver-Client-Id", clientId); 
			//발급받은 PW
			connection.setRequestProperty("X-Naver-Client-Secret", clientSecret); 
			// 받을요청타입
			connection.setRequestProperty("Content-Type", "application/xml"); 
			connection.connect();

			SAXBuilder builder = new SAXBuilder();
			Document   doc = builder.build (connection.getInputStream());

			Element  root     = doc.getRootElement();
			List<Element>   item_list = (List<Element>)root.getChild("channel").getChildren("item");

			int no = start;
			
			for(Element item : item_list){
				String title = item.getChildText("title");
				String link  = item.getChildText("link");
				String image = item.getChildText("image");
				int lprice=0,hprice=0;
				try {
					lprice = Integer.parseInt(item.getChildText("lprice"));
				} catch (Exception e) {
					// TODO: handle exception
				}
				
				try {
					hprice = Integer.parseInt(item.getChildText("hprice"));
				} catch (Exception e) {
					// TODO: handle exception
				}
				
				String mallName = item.getChildText("mallName");
				
				//상품목록을 포장
				ProductVo vo = new ProductVo();
				vo.setNo(no++);
				vo.setTitle(title);
				vo.setLink(link);
				vo.setImage(image);
				vo.setLprice(lprice);
				vo.setHprice(hprice);
				vo.setMallName(mallName);
								
				//ArrayList에 넣기
				list.add(vo);
				

			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		return list;
	}
	
	
}

 

 

Vo는 따로 getter setter만 만들어준다.

ProductVo

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">

	#box {
		width: 1000px;
		margin: auto;
		margin-top: 20px;
	}
	
	

</style>
<script type="text/javascript">
	function search() {
		
		let p_name = $("#p_name").val().trim();
		let p_page = $("#p_page").val();
		let display = $("#display").val();
		
		if(p_name=='') {
			alert("상품명을 입력하세요.");
			$("#p_name").val("");
			$("#p_name").focus();
			return;
		}
		// 가져올 시작 상품위치(p_page에 2를 넣으면 11번부터 시작)
		let start = (p_page-1) * display + 1;
		
		// Ajax 이용해서 상품가져오기
		$.ajax({
			url			:	"product/list.do",	// ProductListAction
			data		:	{"p_name":p_name,"start":start,"display":display},
			success		:	function(res_data){
				$("#disp").html(res_data);
			},
			error		:	function(err){
				alert(err.responseText);
			}
		});
		
		
	}

</script>
</head>
<body>

<div id="box">

<form class="form-inline">
	상품명: <input class="form-control" id="p_name">
			<input class="btn btn-primary" type="button" value="검색" onclick="search();">
			
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	페이지:	<select class="form-control" id="p_page">
				<option value="1">1</option>
				<option value="2">2</option>
				<option value="3">3</option>
				<option value="4">4</option>
				<option value="5">5</option>
			</select>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	페이지당 조회수:<select class="form-control" id="display">
				<option value="10">10개씩 보기</option>
				<option value="20">20개씩 보기</option>
				<option value="30">30개씩 보기</option>
				<option value="50">50개씩 보기</option>
				<option value="100">100개씩 보기</option>
			</select>
	<hr>
	<div id="disp"></div>


</form>
</div>

</body>
</html>

 

 

 

Servlet 작성하기

package action;

import java.io.IOException;
import java.util.List;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import util.MySearchUtil;
import xml.vo.ProductVo;

/**
 * Servlet implementation class ProductListAction
 */
@WebServlet("/product/list.do")
public class ProductListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// /product/list.do?p_name=노트북&start=1%display=10
		request.setCharacterEncoding("utf-8");
		
		String p_name = request.getParameter("p_name");
		
		int start = 1;
		int display = 10;
		// alt + shift + z 사용해서 try/catch 사용
		try {
			start = Integer.parseInt(request.getParameter("start"));
			display = Integer.parseInt(request.getParameter("display"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
		}
		
		// Naver Open API를 이용해서 상품검색...
		 List<ProductVo> p_list = MySearchUtil.search_shop(p_name, start, display);
		 
		// request Binding (변수 값을 저장해서 전달)
		request.setAttribute("p_list", p_list);
		

		// Dispatcher형식으로 호출
		String forward_page = "product_list.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

 

 

 

여기서 product_list.jsp를 ajax로 불렀기 때문에, 기존 페이지에서 이 jsp를 불러온다.

 

검색해서 바로 해당 검색어에 대한 정보를 바로 출력해줄 수 있는것으로 활용할 수 있겠다.

 

jsp 작성(검색 api로 가져온 정보를 담을 jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">
	img {
		width: 120px;
		height: 100px;
	}
	
	td {
		vertical-align: middle !important;
	}
</style>


</head>
<body>

	<table class="table">
		<tr class="success">
			<th>순번</th>
			<th>이미지</th>
			<th>상품명</th>
			<th>최저가</th>
			<th>최고가</th>
			<th>판매처</th>
		</tr>
		<!-- for(ProductVo vo : p_list -->
		<c:forEach var="vo" items="${ p_list }" varStatus="i">
			<tr>
				<td>${ vo.no }</td>
				<td><img src="${ vo.image }"></td>
				<td><a href="${ vo.link }">${ vo.title }</a></td>
				<td><fmt:formatNumber type="currency" value="${ vo.lprice }"/></td>
				<td><fmt:formatNumber type="currency" value="${ vo.hprice }"/></td>
				<td>${ vo.mallName }</td>
			</tr>
		</c:forEach>
		
	</table>


</body>
</html>

 

 

 

반응형