HttpClient는 클라이언트 측 HTTP 통신 구현 라이브러리입니다. HttpClient의 목표는 HTTP 메시지를 보내고 받는 것입니다.
전통적인 JDK와 함께 제공되는 URLConnection에 비해 HttpClient는 사용 편의성과 유연성이 향상되었습니다(구체적인 차이점은 나중에 논의하겠습니다). 이는 클라이언트가 Http 요청을 보내는 방법일 뿐만 아니라 개발자가 인터페이스(HTTP 프로토콜 기반)를 테스트할 수 있게 하여 개발 효율성을 향상시킬 뿐만 아니라 기술 개선도 촉진합니다. 코드의 견고성. 따라서 HttpClient에 대한 숙련도는 매우 중요하고 필수입니다. HttpClient를 마스터하고 나면 Http 프로토콜에 대한 이해가 더욱 깊어질 것이라고 믿습니다.
1. 소개
HttpClient는 HTTP 프로토콜을 지원하는 효율적이고 기능이 풍부한 최신 클라이언트 프로그래밍 툴킷을 제공하는 데 사용되는 Apache Jakarta Common의 하위 프로젝트이며, HTTP 프로토콜의 최신 버전과 권장 사항을 지원합니다. HttpClient는 많은 프로젝트에서 사용되었습니다. 예를 들어 Apache Jakarta, Cactus 및 HTMLUnit의 다른 두 가지 유명한 오픈 소스 프로젝트는 모두 HttpClient를 사용합니다.
다운로드 주소: http://hc.apache.org/downloads.cgi
2. 특징
1. 표준 및 순수 Java 언어를 기반으로 합니다. Http1.0, Http1.1 구현
2. 확장 가능한 객체지향 구조로 모든 HTTP 메소드(GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE)를 구현합니다.
3. HTTPS 프로토콜을 지원합니다.
4. HTTP 프록시를 통해 투명한 연결을 설정합니다.
5. CONNECT 메서드를 사용하여 Http 프록시를 통해 터널링된 https 연결을 설정합니다.
6. 기본, 다이제스트, NTLMv1, NTLMv2, NTLM2 세션, SNPNEGO/Kerberos 인증 체계.
7. 플러그인 사용자 정의 인증 체계.
8. 휴대 가능하고 안정적인 소켓 팩토리를 사용하면 타사 솔루션을 더 쉽게 사용할 수 있습니다.
9. 연결 관리자는 다중 스레드 응용 프로그램을 지원합니다. 각 호스트에 대한 최대 연결 수 설정은 물론 최대 연결 수 설정을 지원하고 만료된 연결을 검색하고 닫습니다.
10. Set-Cookie에서 쿠키를 자동으로 처리합니다.
11. 플러그인 사용자 정의 쿠키 정책.
12. 요청의 출력 스트림은 스트림의 콘텐츠를 소켓 서버에 직접 버퍼링하는 것을 피할 수 있습니다.
13. 응답의 입력 스트림은 소켓 서버에서 직접 해당 콘텐츠를 효과적으로 읽을 수 있습니다.
14. KeepAlive를 사용하여 http1.0 및 http1.1에서 지속적인 연결을 유지합니다.
15. 서버에서 보낸 응답 코드와 헤더를 직접 가져옵니다.
16. 연결 시간 초과를 설정하는 기능.
17. http1.1 응답 캐싱을 실험적으로 지원합니다.
18. 소스 코드는 Apache 라이센스에 따라 무료로 제공됩니다.
3. 사용방법
HttpClient를 사용하여 요청을 보내고 응답을 받는 것은 매우 간단합니다. 일반적으로 다음 단계가 필요합니다.
1. HttpClient 객체를 생성합니다.
2. 요청 메소드의 인스턴스를 생성하고 요청 URL을 지정합니다. GET 요청을 보내야 하는 경우 HttpGet 개체를 만들고, POST 요청을 보내야 하는 경우 HttpPost 개체를 만듭니다.
3. 요청 매개변수를 보내야 하는 경우 HttpGet 및 HttpPost에 공통적인 setParams(HetpParams params) 메서드를 호출하여 HttpPost 개체에 대한 요청 매개변수를 추가할 수 있으며, setEntity(HttpEntity 엔터티) 메서드를 호출하여 요청을 설정할 수도 있습니다. 매개변수.
4. HttpClient 개체의 실행(HttpUriRequest 요청)을 호출하여 요청을 보냅니다. 이 메서드는 HttpResponse를 반환합니다.
5. HttpResponse의 getAllHeaders(), getHeaders(String name) 및 기타 메서드를 호출하여 서버의 응답 헤더를 가져옵니다. HttpResponse의 getEntity() 메서드를 호출하여 서버의 응답 콘텐츠를 래핑하는 HttpEntity 개체를 가져옵니다. 프로그램은 이 개체를 통해 서버의 응답 내용을 얻을 수 있습니다.
6. 연결을 해제합니다. 실행 방법의 성공 여부에 관계없이 연결을 해제해야 합니다.
4. 예시
패키지 com.test; import java.io.FileInputStream; import java.io.UnsupportedEncodingException; import java.security.KeyStore; security.KeyStoreException; 가져오기 java.security.NoSuchAlgorithmException; java.security.cert.CertificateException; import java.util.List; import org.apache.http.NameValuePair; org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; ;수입 org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; org.apache.http.entity.mime.MultipartEntityBuilder 가져오기 org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; .client.HttpClients; 가져오기 org.apache.http.message.BasicNameValuePair; org.apache.http.util.EntityUtils; import org.junit.Test; public class HttpClientTest { @Test public void jUnitTest() { get() } /** * HttpClient가 SSL에 연결됨 */ public void ssl() CloseableHttpClient httpclient = null 시도 { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore")) try { // 키 저장소 로드 d://tomcat.keystore trustStore.load(instream) , "123456".toCharArray()) } catch (CertificateException e) { e.printStackTrace() } finally { 시도 { instream.close(); } catch (예외 무시) { } } // 자체 CA 및 자체 서명된 모든 인증서를 신뢰합니다. SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // TLSv1 프로토콜만 사용하도록 허용 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // http 요청 생성(가져오기 모드) HttpGet httpget = 새로운 HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("요청 실행 중" + httpget.getRequestLine()) CloseableHttpResponse response = httpclient.execute(httpget); { HttpEntity 엔터티 = response.getEntity() System.out.println("-------------------- -------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("응답 내용 길이: " +entity.getContentLength()) System.out.println(EntityUtils.toString) (엔티티)); EntityUtils.consume(엔티티) } } 마지막으로 { response.close() } } (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace() } catch (KeyManagementException e) { e.printStackTrace() } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace() } finally { if (httpclient != null) { try { httpclient.close(); } catch (IOException e) { e.printStackTrace() } } } } /** * 게시 모드에서 양식 제출(사용자 로그인 요청 시뮬레이션) */ public void postForm() // 기본 httpClient 인스턴스를 생성합니다. CloseableHttpClient httpclient = HttpClients.createDefault() // httppost 생성 HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // 매개변수 대기열 생성 List<namevaluepair> formparams = new ArrayList<namevaluepair>() formparams.add(new BasicNameValuePair("username") , "admin")); formparams.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity uefEntity; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); System.out.println("실행 요청" + httpclient.execute (http포스트)를 시도해 보세요. HttpEntity 엔터티 = response.getEntity(); if (entity != null) { System.out.println("------------- ------------"); System.out.println("응답 내용: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-- -----------------------"); } } 마침내 { response.close(); } } 잡다 (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace() } catch (IOException e) { e.printStackTrace() } finally { // 연결을 닫고 리소스를 해제합니다. httpclient .close(); } catch (IOException e) { e.printStackTrace() } } /** * 로컬 애플리케이션에 액세스하기 위한 게시 요청을 보내고 전달된 다양한 매개변수에 따라 다른 결과를 반환합니다. */ public void post() { // 기본 httpClient 인스턴스를 생성합니다. CloseableHttpClient httpclient = HttpClients.createDefault() // httppost 생성 HttpPost httppost = new HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action") // 매개변수 대기열 생성 List<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")) try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8) "); httppost.setEntity(uefEntity); System.out.println("요청 실행 중" + httppost.getURI()); CloseableHttpResponse response = httpclient.execute(httppost); try { HttpEntity 엔터티 = response.getEntity() if (entity != null); .println("------------------"); .out.println("응답 내용: " + EntityUtils.toString(entity, "UTF-8")) System.out.println("---------------- ---------"); } } 마지막으로 { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } 잡기(IOException e) { e.printStackTrace(); } finally { // 연결을 닫고 리소스를 해제합니다. try { httpclient.close() } catch (IOException e) { e.printStackTrace() } } } /** * 가져오기 요청 보내기* / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault() try { // httpget을 생성합니다. HttpGet("http://www.baidu.com/"); System.out.println("요청 실행 중" + httpget.getURI()); // 요청 가져오기 실행 CloseableHttpResponse response = httpclient.execute(httpget); try { // 응답 엔터티 가져오기 HttpEntity 엔터티 = response.getEntity() System.out.println("------------- ----------"); // 응답 상태 인쇄 System.out.println(response.getStatusLine()); if (entity != null) { // 응답 내용 길이 인쇄 System.out.println("응답 내용 길이: " +entity.getContentLength()); //응답 내용 인쇄 System.out.println("응답 내용: " + EntityUtils.toString(entity)); System.out.println("---------------"); } 마지막으로 { response .close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace() } catch (IOException e) { e.printStackTrace(); finally { // 연결을 닫고 리소스를 해제합니다. try { httpclient.close() } catch(IOException; e) { e.printStackTrace(); } } } /** * 파일 업로드*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault() try { HttpPost httppost = new HttpPost("http://localhost: 8080/myDemo/Ajax/serivceFile.action"); FileBody bin = 새 FileBody(새 항목 File("F://image//sendpix0.jpg")); StringBody comment = new StringBody("일종의 바이너리 파일", ContentType.TEXT_PLAIN) HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin ", bin).addPart("comment", comment).build(); httppost.setEntity(reqEntity); System.out.println("요청 실행 중" + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost) try { System.out.println("------------ ----------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = 응답. getEntity( ) if (resEntity); != null) { System.out.println("응답 콘텐츠 길이: " + resEntity.getContentLength()) } EntityUtils.consume(resEntity) } finally { response.close() } } catch(ClientProtocolException e); e.printStackTrace(); } catch (IOException e) { e.printStackTrace() } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace() } } } }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>
이 예에서는 최신 버전의 HttpClient4.3을 사용합니다. 이번 버전은 이전의 코드 작성 스타일과 많이 다르므로 더욱 주의해 주시기 바랍니다.
좋습니다. 위 내용이 이 기사의 전체 내용입니다. 마음에 드셨으면 좋겠습니다.