2009-08-24 3 views
72

성능, 안정성, 성숙도면에서 HTTP POST, GET 등에 가장 적합한 Java 라이브러리는 무엇입니까? 특정 라이브러리가 다른 라이브러리보다 많이 사용됩니까?HTTP POST, GET 등에 가장 적합한 Java 라이브러리는 무엇입니까?

나의 요구 사항은 HTTPS POST 요청을 원격 서버에 제출하는 것입니다. org.apache.commons.httpclient. * 패키지뿐만 아니라 과거에는 java.net. * 패키지를 사용했습니다. 두 사람 모두 일을 마쳤지 만, 당신의 의견이나 추천을 듣고 싶습니다.

답변

81

이럴 : Apache HTTP Client

사용 예 :

import org.apache.commons.httpclient.*; 
import org.apache.commons.httpclient.methods.*; 
import org.apache.commons.httpclient.params.HttpMethodParams; 

import java.io.*; 

public class HttpClientTutorial { 

    private static String url = "http://www.apache.org/"; 

    public static void main(String[] args) { 
    // Create an instance of HttpClient. 
    HttpClient client = new HttpClient(); 

    // Create a method instance. 
    GetMethod method = new GetMethod(url); 

    // Provide custom retry handler is necessary 
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
      new DefaultHttpMethodRetryHandler(3, false)); 

    try { 
     // Execute the method. 
     int statusCode = client.executeMethod(method); 

     if (statusCode != HttpStatus.SC_OK) { 
     System.err.println("Method failed: " + method.getStatusLine()); 
     } 

     // Read the response body. 
     byte[] responseBody = method.getResponseBody(); 

     // Deal with the response. 
     // Use caution: ensure correct character encoding and is not binary data 
     System.out.println(new String(responseBody)); 

    } catch (HttpException e) { 
     System.err.println("Fatal protocol violation: " + e.getMessage()); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     System.err.println("Fatal transport error: " + e.getMessage()); 
     e.printStackTrace(); 
    } finally { 
     // Release the connection. 
     method.releaseConnection(); 
    } 
    } 
} 

몇 가지 하이라이트 기능 :

  • 표준을 기반으로, 순수 자바, HTTP 버전 1.0 및 1.1
    • 를 구현 전체 구현 확장 가능한 OO 프레임 워크의 모든 HTTP 메소드 (GET, POST, PUT, DELETE, HEAD, OPTIONS 및 TRACE)
    • HTTPS (HTTP over SSL) 프로토콜을 통한 암호화를 지원합니다.
    • 세분화 된 비표준 구성 및 추적.
    • HTTP 프록시를 통한 투명한 연결.
    • CONNECT 메서드를 통해 HTTP 프록시를 통해 터널링 된 HTTPS 연결.
    • 네이티브 Java 소켓 지원을 사용하는 SOCKS 프록시 (버전 4 & 5)를 통한 투명 연결.
    • Basic, Digest 및 암호화 NTLM (NT Lan Manager) 방법을 사용하는 인증.
    • 사용자 정의 인증 방법을위한 플러그인 메커니즘.
    • 대용량 파일 업로드를위한 다중 파트 양식 POST. 멀티 스레드 응용 프로그램에서 사용하기 위해 쉽게에 사용하는 타사 솔루션
    • 연결 관리 지원을
    • 플러그 보안 소켓 구현. 최대 연결 수를 설정하고 호스트 당 최대 연결 수를 으로 설정할 수 있습니다. 부실 연결을 감지하고 닫습니다.
    • 서버의 Set-Cookie : 헤더를 읽고 적절한 경우 Cookie : 헤더로 다시 전송하기위한 자동 쿠키 처리.
    • 사용자 지정 쿠키 정책을위한 플러그인 메커니즘입니다.
    • 서버로 직접 소켓으로 스트리밍하여 콘텐츠 본문을 버퍼링하지 않도록 출력 스트림을 요청하십시오. 서버에 .
    • 효율적으로 응답 본문을 읽을 수있는 응답 입력 스트림 소켓에서 직접 서버로 으로 스트리밍합니다.
    • HTTP/1.0에서는 KeepAlive를 사용하고 HTTP/1.0에서는 지속성 을 사용하는 영구 연결입니다.1
    • 서버가 보낸 응답 코드와 헤더에 대한 직접 액세스.
    • 연결 시간 제한을 설정할 수있는 기능입니다.
    • HttpMethods는 병렬 요청을 허용하고 연결을 효율적으로 다시 사용할 수 있도록 명령 패턴을 구현합니다.
    • 소스 코드는 Apache Software License에 따라 무료로 사용할 수 있습니다.
+4

+1 위대한 답변 : 좋은 예입니다. 큰 포인트. 정말로 Apache HTTP Client를 판매합니다. – therobyouknow

+17

설명서는 날짜가 없습니다. HttpClient는 더 이상 구체적인 클래스가 아니며 인터페이스이기 때문에 위의 코드는이 HttpClient 인터페이스를 인스턴스화하려고 시도 할 때 작동하지 않습니다. 대신 HttpClient 인터페이스를 구현하는 클래스 (예 : DefaultHttpClient)를 인스턴스화해야합니다. – therobyouknow

+3

모든 릴리스가 너무 많은 주요 변경 사항 인 것처럼 느껴집니다 ... 몇 년 동안이 라이브러리에 실망하게되었습니다 .... 이제는 최대 20 개의 설정을 가진 풀에서 연결이 누출되는 것 같습니다 .... grrrrrr. –

8

나는 HttpClient를 표준의 어떤 동의 -하지만 난 당신이

으로 Restlet 특별히 RESTful 웹 서비스와 interactong을 위해 디자인 된 HTTP 클라이언트를 제공합니다 ... 그래서 옵션을 찾고있는 것 같아요.

예제 코드 :

Client client = new Client(Protocol.HTTP); 
    Request r = new Request(); 
    r.setResourceRef("http://127.0.0.1:8182/sample"); 
    r.setMethod(Method.GET); 
    r.getClientInfo().getAcceptedMediaTypes().add(new Preference<MediaType>(MediaType.TEXT_XML)); 
    client.handle(r).getEntity().write(System.out); 

내가 Apache HttpComponents HttpClient, 나는 또한 HtmlUnit과 살펴보고 추천 할 것입니다 Commons HttpClient

의 후계자에게 추천 할 것입니다 자세한 내용

15

나는 다소 부분적으로 Jersey입니다. 우리는 모든 프로젝트에서 1.10을 사용하며 해결할 수없는 문제에 직면하지 않았습니다. 내가 좋아하는 이유

몇 가지 이유 :

  • 공급자 - 만든 비누 1.1/1.2 뉴저지에서 제공하고 JAX-WS의 부피가 큰 AXIS를 사용할 필요를 제거했다가
  • 필터를 호출 - 생성 된 데이터베이스 중요한 정보 로깅을 방지하면서 전체 요청 (요청/응답 헤더 포함)을 기록하는 필터를 로깅합니다.
  • JAXB가 -
  • API 진리에서

사용하기 쉬운 바로 요청/응답으로/객체에서 마샬링 지원, HttpClient를 저지 구현 및 API에 매우 유사합니다. HTTPClient를 지원할 수있는 Jersey 확장도 있습니다. 뉴저지 1.x에서와

일부 코드 샘플 : 저지 클라이언트와 https://blogs.oracle.com/enterprisetechtips/entry/consuming_restful_web_services_with

http://www.mkyong.com/webservices/jax-rs/restful-java-client-with-jersey-client/

HttpClient를이 : https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

4

나는 당신에게 corn-httpclient 추천 수 있습니다. 대부분의 경우 간단하고 빠르며 충분합니다.그것뿐만 아니라 안드로이드와 앱 엔진에서 실행할 수 있기 때문에

HttpForm form = new HttpForm(new URI("http://localhost:8080/test/formtest.jsp")); 
//Authentication form.setCredentials("user1", "password"); 
form.putFieldValue("input1", "your value"); 
HttpResponse response = form.doPost(); 
assertFalse(response.hasError()); 
assertNotNull(response.getData()); 
assertTrue(response.getData().contains("received " + val)); 

받는다는 의존성

<dependency> 
    <groupId>net.sf.corn</groupId> 
    <artifactId>corn-httpclient</artifactId> 
    <version>1.0.0</version> 
</dependency> 
1

나는 Ning Async Http Client Library을 언급하고자합니다. 필자는 한번도 사용해 본 적이 없지만 동료는 항상 과거에 사용했던 Apache Http Client와 비교하여 그것에 대해 열광했습니다. 나는 특히 그것이 더 친숙하고 높은 존중감을 가지고있는 고성능 비동기 I/O 프레임 워크 인 Netty을 기반으로 배우는 데 관심이있었습니다.

관련 문제