본문 바로가기

학원/복기

[AJAX] RSS 서비스 활용하기

RSS(Really Simple Syndication 또는 Rich Site Summary)

: 블로그, 뉴스, 기업정보 등과 같이 자주 업데이트 되는 사이트의 컨텐츠를 보다 쉽게 사용자에게 제공하기 위한 만들어진 서비스
 
 

예시로 경향신문의 스포츠 부문을 이용했다 (https://www.khan.co.kr/rss/rssdata/kh_sports.xml)
원하는 서비스 링크 복사해서 사용하면 된다
 


 
RSS 서비스를 제공하는 웹프로그램을 AJAX 기능으로 요청하여 실행결과를 응답받아 클라이언트에게 전달하여 응답하는 JSP 문서를 만들어보자.
 
하지만 현재 실행중인 웹프로그램과 동일한 서버의 웹프로그램은 AJAX 기능으로 요청하여 실행결과를 응답받아 처리 가능하지만 다른 서버의 웹프로그램을 AJAX 기능으로 요청할 경우 에러(에러코드 : 0) 이 발생한다는 문제가 발생한다. 
해결법은 다른 서버의 웹프로그램을 프록시 기능으로 요청하여 응답하는 프로그램을 작성해 AJAX 기능으로 프록시 프로그램 요청하여 실행결과를 응답받아 처리하는 것이다. 
 
[rss_reader.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>  
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AJAX</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
</head>
<body>
	<h1>RSS Reader</h1>
	<hr>
	<div id="display"></div>
	
	<script type="text/javascript">
	$.ajax({
		type: "get",
		//에러 발생
		//url: "https://www.khan.co.kr/rss/rssdata/kh_sports.xml",
		
		url: "rss_proxy.jsp",
		
		dataType: "xml",
		success: function(xmlDoc) {
			var channelTitle=$(xmlDoc).find("channel").children("title").text();
			
			var html="<h2>"+channelTitle+"</h2>";
			html+="<ul>";
			$(xmlDoc).find("item").each(function() {
				var title=$(this).find("title").text();
				var link=$(this).find("link").text();
				var date;
				if($(this).find("pubDate").length!=0) {
					date=$(this).find("pubDate").text();
				} else {
					date=$(this).find("dc\\:date").text();
				}
				html+="<li><a hrf='"+link+"' target='_blank'>"+title+"["+date+"]</a></li>";
			});
			html+="</ul>";
			
			$("#display").html(html);
		},
		error: function(xhr) {
			alert("에러코드 = "+xhr.status);
		}
	});
	</script>
</body>
</html>

 
 
가상의 클라이언트(브라우저)를 이용하여 다른 서버의 웹프로그램을 요청하고 실행결과를 제공받아 클라이언트에게 그대로 전달하여 응답하는 JSP 문서 [rss_proxy.jsp] 만들기 
→ HttpClient 객체를 사용하여 프록시(Proxy) 기능을 제공하는 웹프로그램 작성 
 
https://apache.org 사이트에서 필요한 라이브러리 파일을 다운로드 받아 프로젝트 빌드 처리 (commons-httpclient-3.1.jar, commons-codec-1.16.jar, commons-logging-1.2.jar)
 

 

<%@page import="org.apache.commons.httpclient.methods.GetMethod"%>
<%@page import="org.apache.commons.httpclient.HttpClient"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//요청 웹프로그램의 URL 주소 저장
	String url="https://www.khan.co.kr/rss/rssdata/kh_sports.xml";

	//HttpClient 객체 생성 - 가상의 브라우저 기능을 제공하기 위한 객체
	HttpClient client=new HttpClient();
	
	//GetMethod 객체 생성 - 가상의 브라우저를 사용하여 GET 방식으로 웹프로그램을 요청하기 위한 객체
	// => PostMethod 객체 : 가상의 브라우저를 사용하여 POST 방식으로 웹프로그램을 요청하기 위한 객체
	GetMethod method=new GetMethod(url);
	
	try {
		//HttpClient.executeMethod(Method method) : 가상의 브라우저를 사용하여 웹프로그램을 요청하는 메소드
		// => 가상의 브라우저로 요청한 웹프로그램 실행에 대한 상태코드(StatusCode - int) 반환 
		int statusCode=client.executeMethod(method);
		
		//클라이언트에게 응답하기 위한 프록시 프로그램의 response 객체 초기화
		response.reset();
		
		//프록시 프로그램의 출력스트림(out 객체) 초기화
		out.clearBuffer();
		
		//프록시 프로그램을 요청한 클라이언트에게 상태코드 전달
		response.setStatus(statusCode);
		
		if(statusCode==HttpServletResponse.SC_OK) {//정상적인 실행결과를 응답받은 경우 - 상태코드 : 200
			//Method.getResponseBodyAsString() : 요청에 대한 실행결과가 저장된 리스폰즈 메세지
			//몸체부의 결과값을 문자열로 반환하는 메소드
			// => 결과값을 반환받아 원하는 문자형태(캐릭터셋)으로 변경하여 저장
			String result=new String(method.getResponseBodyAsString().getBytes("8859_1"),"utf-8");
			
			//프록시 프로그램을 요청한 클라이언트에게 실행결과에 대한 문서형태(MimeType)를 전달
			response.setContentType("text/xml; charset=utf-8");
			
			//프록시 프로그램을 요청한 클라이언트에게 실행결과를 전달
			out.println(result);
		}
	} finally {
		//가상의 브라우저를 사용하여 접속된 웹서버의 연결 해제
		//Method.releaseConnection() : 웹서버 접속을 해제하는 메소드
		if(method!=null) method.releaseConnection();
	}
%>

 
 

정보는 계속 업데이트된다

 
 
 
 

'학원 > 복기' 카테고리의 다른 글

[MVC] Model2  (0) 2023.07.11
[MVC] MVC Model1 / MVC Model2  (0) 2023.07.09
[AJAX] XSL 문서 / XSLT 예제  (0) 2023.07.06
[AJAX] jdbc 연결 / CDATA  (0) 2023.07.06
[AJAX] jQuery를 이용한 AJAX 사용  (0) 2023.07.05