IT/웹프로그래밍

HttpClient 라이브러리 사용하기

thesse 2019. 7. 31. 20:33
300x250
반응형

HttpClient 라이브러리 다운받기

아파치 홈페이지에서 최신버전을 다운받는다.

Source는 무엇인지 모르겠고, Binary 파일을 받아야 안에 .jar 파일이 있기에 이것을 다운받았다.

 

 

다운받아보면 이렇게 lib폴더 안에 jar 파일들이 있다.

몽땅 서버로 올려준다.

 

 

현재 나는 이클립스도, 윈도우 톰캣도 없는 상태로 작업중이므로

리눅스 서버에 있는 /usr/share/tomcat8/lib 디렉토리 아래에 파일들을 집어넣었다.

그리고 톰캣 리스타트.

 

 

 

웹으로 xml파일 조회하여 파싱하기

 

임포트

<!DOCTYPE html>
<meta charset="utf-8">

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<%@ page import= "org.apache.http.HttpEntity" %>
<%@ page import= "org.apache.http.HttpResponse" %>
<%@ page import= "org.apache.http.NameValuePair" %>
<%@ page import= "org.apache.http.ParseException" %>
<%@ page import= "org.apache.http.client.HttpClient" %>
<%@ page import= "org.apache.http.client.entity.UrlEncodedFormEntity" %>
<%@ page import= "org.apache.http.client.methods.HttpGet" %>
<%@ page import= "org.apache.http.client.methods.HttpPost" %>
<%@ page import= "org.apache.http.impl.client.DefaultHttpClient" %>
<%@ page import= "org.apache.http.message.BasicNameValuePair" %>
<%@ page import= "org.apache.http.params.HttpConnectionParams" %>
<%@ page import= "org.apache.http.util.EntityUtils" %>
<%@ page import= "org.apache.http.conn.ClientConnectionManager" %>
<%@ page import= "org.apache.http.params.HttpParams" %>
<%@ page import= "org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager" %>
<%@ page import="java.io.*" %>
<%@ page import="java.text.*,java.util.*,java.sql.*,javax.servlet.*,javax.sql.*,javax.naming.*" %>
<%@ page import = "javax.xml.parsers.*,org.w3c.dom.*" %>

 

웹상에 있는 xml파일 값 받아오기

<html>
	<head>
		<%!
			DefaultHttpClient client;
			
			// HttpClient 재사용 관련 서버 통신시 세션을 유지하기 위함... HttpClient 4.5.2 -> http://hc.apache.org/download.cgi
			// 마치 브라우저로 조회하여 세션이 유지되는 효과를 얻음
			public DefaultHttpClient getThreadSafeClient(){
				if(client != null) return client;
				
				client = new DefaultHttpClient();
				ClientConnectionManager mgr = client.getConnectionManager();
				HttpParams params = client.getParams();
				client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, mgr.getSchemeRegistry()), params);
				
				return client;				
			}
			
			// 해당 url 주소를 입력하여 xml 파일을 리턴받는 함수
			public String goXML(String getURL){
				String Result = null;
				
				// 세션 유지 체크
				HttpClient client = getThreadSafeClient();
				// 클라이언트가 요청 보냈을 때 일정시간 서버 응답 없으면 연결 끊기
				HttpConnectionParams.setConnectionTimeout(client.getParams(), 1000*100);
				// 클라이언트-서버간 요청이나 응답이 일정시간 없으면 연결 끊기
				HttpConnectionParams.setSoTimeout(client.getParams(), 1000*100);
				// post 메소드 url 생성
				HttpPost post = new HttpPost(getURL);
				
				// 파라메터 전달하기
				// NameValuePair : post방식 //URIBuilder : get방식
				List <NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
				if(false){
					nameValuePairs.add(new BasicNameValuePair("input", "value"));
				}
				
				try{
					post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
					
					HttpResponse responsePost = null;
					// http 서버에 request 보내서 response 전달받기
					responsePost = client.execute(post);
					HttpEntity resEntity = responsePost.getEntity();
					
					if(resEntity != null){
						Result = EntityUtils.toString(resEntity).trim();
					}
				} catch(Exception e){
					e.printStackTrace();
				} finally{
					
				}
				
				return Result;
			}
			
		%>
	</head>

 

 

 

파싱해서 출력

	<body>
		<h1>성적 조회</h1>
		<%
			// goXML 함수에 url을 입력하여 xml 파일을 리턴받음
			String ret = goXML("http://서버주소/xmlmake.jsp");
			//out.print(ret);	// 확인용
			
			try{
				
				// DocumentBuilderFactory 객체 생성
				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
				// DocumentBuilder 객체 생성
				DocumentBuilder builder = factory.newDocumentBuilder();
				
				//ret으로부터 byte 배열을 가지고와서 내부 버퍼에 보관
				ByteArrayInputStream is = new ByteArrayInputStream(ret.getBytes("utf-8"));
				// builder를 이용하여 XML 파싱하여 Document 객체 생성
				Document doc = builder.parse(is);
				
				// 생성된 document에서 각 요소들을 접근하여 데이터를 저장함
				Element root = doc.getDocumentElement();
				NodeList tag_name = doc.getElementsByTagName("name");	//xml name tag
				NodeList tag_studentid = doc.getElementsByTagName("studentid");	//xml studentid tag
				NodeList tag_kor = doc.getElementsByTagName("kor");	//xml kor tag
				NodeList tag_eng = doc.getElementsByTagName("eng");	//xml eng tag
				NodeList tag_mat = doc.getElementsByTagName("mat");	//xml mat tag
		%>
		
		<table cellspacing=1 width=500 border=1>
			<tr>
				<td width=100>이름</td>
				<td width=100>학번</td>
				<td width=100>국어</td>
				<td width=100>영어</td>
				<td width=100>수학</td>
			</tr>
		
		<%	
				
				for(int i=0; i<tag_name.getLength(); i++){
					out.print("<tr>");
					out.print("<td>"+tag_name.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_studentid.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_kor.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_eng.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_mat.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("</tr>");
				}
		%>
			</table>
		<%
				
			}catch(Exception e){
				e.printStackTrace();
			}
		%>
	</body>
</html>

 

실행결과

 

 

 

음... 어렵다.

거의 이해못하고 교안대로 따라했는데, 나중에 다시 봐야겠다.

 

DefaultHttpClient는 이제 안쓰이는 방식이고, 대신 HttpClientBuilder를 쓴다는데

어떻게 하는지 모르겠다.

이것 역시 나중에 봐야지...

 

300x250
반응형