2009-08-24 3 views
72

¿Cuál es la mejor biblioteca de Java para HTTP POST, GET, etc. en términos de rendimiento, estabilidad, madurez, etc.? ¿Hay alguna biblioteca en particular que se use más que otras?¿Cuál es la mejor biblioteca de Java para HTTP POST, GET, etc.?

Mis requisitos están enviando solicitudes HTTPS POST a un servidor remoto. He utilizado el paquete java.net. * En el pasado y el paquete org.apache.commons.httpclient. *. Ambos han hecho el trabajo, pero me gustaría algunas de sus opiniones/recomendaciones.

Respuesta

81

en mi humilde opinión: Apache HTTP Client

ejemplo de uso:

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(); 
    } 
    } 
} 

algunas funciones destacadas:

  • Basado en estándares, Java puro, la implementación de versiones de HTTP 1.0 y 1,1
    • Plena aplicación de todos los métodos HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS, y TRACE) en un marco OO extensible .
    • Admite el cifrado con protocolo HTTPS (HTTP sobre SSL).
    • Configuración granular no estándar y seguimiento.
    • Conexiones transparentes a través de proxies HTTP.
    • Conexiones HTTPS en túnel a través de proxies HTTP, a través del método CONNECT .
    • Conexiones transparentes a través de proxies SOCKS (versión 4 & 5) usando soporte nativo de socket Java.
    • Autenticación mediante los métodos Basic, Digest y encriptación NTLM (NT Lan Manager).
    • Mecanismo de complemento para métodos de autenticación personalizados.
    • Formulario de varias partes POST para cargar archivos de gran tamaño.
    • enchufables Secure Sockets implementaciones de soluciones de TI, lo que hace más fácil el uso de terceros
    • apoyo a la gestión de conexión para su uso en multi-hilo aplicaciones. Soporta la configuración de las conexiones máximas totales de , así como las conexiones máximas por host. Detecta y cierra conexiones obsoletas.
    • Manejo automático de cookies para leer Set-Cookie: encabezados desde el servidor y enviándolos nuevamente en un Cookie: encabezado cuando corresponda.
    • Mecanismo de complemento para políticas personalizadas de cookies.
    • Solicite las secuencias de salida para evitar almacenar en el búfer cualquier cuerpo de contenido por directamente al socket del servidor.
    • Corrientes de entrada de respuesta para leer eficientemente el cuerpo de la respuesta por transmitiendo directamente desde el socket al servidor .
    • Conexiones persistentes utilizando KeepAlive en HTTP/1.0 y persistencia en HTTP/1.1
    • Acceso directo al código de respuesta y a los encabezados enviados por el servidor.
    • La capacidad de establecer tiempos de espera de conexión.
    • HttpMethods implementa el patrón de comando para permitir las solicitudes paralelas y la reutilización eficiente de las conexiones .
    • El código fuente está disponible gratuitamente bajo la licencia del software Apache.
+4

+1 Gran respuesta: Gran ejemplo. Grandes puntos. Realmente vendes Apache HTTP Client. – therobyouknow

+17

Sin embargo, la documentación está FUERA DE FECHA. HttpClient ya no es una clase concreta, es una interfaz, por lo tanto, el código anterior NO FUNCIONARÁ, ya que intenta crear una instancia de esta interfaz HttpClient. En su lugar, deberá instanciar una clase que implemente la interfaz HttpClient, por ejemplo, DefaultHttpClient. – therobyouknow

+3

parece que cada lanzamiento implica demasiados cambios importantes ... realmente me siento frustrado con esta biblioteca a lo largo de los años ... y ahora parece que se filtran las conexiones de la agrupación, que tengo un máximo de 20 instaladas ... grrrrrr. –

8

Estoy de acuerdo httpclient es algo así como un estándar - pero supongo que busca opciones para ...

Restlet proporciona un cliente HTTP especialmente diseñado para interactong con los servicios web reparador.

código Ejemplo:

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); 

Ver http://www.restlet.org/ para más detalles

15

Estoy algo de acuerdo con Jersey. Usamos 1.10 en todos nuestros proyectos y no nos hemos encontrado con un problema que no podamos resolver con él.

Algunas razones por las que me gusta:

  • Proveedores - jabón creado 1.1/1.2 proveedores en Jersey y han eliminado la necesidad de usar el eje voluminosos para nuestra JAX-WS pide
  • Filtros - base de datos creada los filtros de inicio de sesión para registrar la solicitud completa (incluidos los encabezados de solicitud/respuesta) al tiempo que se evita el registro de información confidencial.
  • JAXB - admite el cálculo de referencias a/de los objetos directamente de la petición/respuesta
  • API es fácil de usar

En verdad, HTTPClient y Jersey son muy similares en su aplicación y la API. También hay una extensión para Jersey que le permite admitir HTTPClient.

Algunos ejemplos de código con 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 con Jersey Cliente: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

4

Puedo recomendar corn-httpclient. Es simple, rápido y suficiente para la mayoría de los casos.

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)); 

dependencia Maven

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

Quiero mencionar el Ning Async Http Client Library. Nunca lo he usado, pero mi colega se jacta de ello en comparación con Apache Http Client, que siempre he usado en el pasado. Me interesó especialmente saber que se basa en Netty, el marco de E/S asíncronas de alto rendimiento, con el que estoy más familiarizado y tengo mucha estima.

Cuestiones relacionadas