¿Cuál es la mejor biblioteca de Java para usar para HTTP POST, GET, etc.? [cerrado]

97

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

Mis requisitos son enviar solicitudes HTTPS POST a un servidor remoto. He usado el paquete java.net. * En el pasado, así como el paquete org.apache.commons.httpclient. *. Ambos han hecho el trabajo, pero me gustaría recibir algunas de sus opiniones / recomendaciones.

rmcc
fuente

Respuestas:

107

En mi humilde opinión: Cliente HTTP Apache

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 características destacadas:

  • Basada en estándares, Java puro, implementación de las versiones HTTP 1.0 y 1.1
    • Implementación completa de todos los métodos HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS y TRACE) en un marco OO extensible.
    • Admite cifrado con protocolo HTTPS (HTTP sobre SSL).
    • Configuración y seguimiento granular no estándar.
    • Conexiones transparentes a través de proxies HTTP.
    • Conexiones HTTPS tunelizadas a través de proxies HTTP, mediante el método CONNECT.
    • Conexiones transparentes a través de proxies SOCKS (versión 4 y 5) utilizando soporte nativo de sockets Java.
    • Autenticación mediante los métodos Basic, Digest y cifrado NTLM (NT Lan Manager).
    • Mecanismo de complemento para métodos de autenticación personalizados.
    • POST de formulario de varias partes para cargar archivos grandes.
    • Implementaciones de enchufes seguros conectables, lo que facilita el uso de soluciones de terceros
    • Soporte de administración de conexiones para uso en aplicaciones multiproceso. Admite establecer el número máximo de conexiones totales, así como el número máximo de conexiones por host. Detecta y cierra conexiones obsoletas.
    • Manejo automático de cookies para leer los encabezados de Set-Cookie: del servidor y enviarlos de vuelta en un encabezado de Cookie: cuando sea apropiado.
    • Mecanismo de complemento para políticas de cookies personalizadas.
    • Solicite flujos de salida para evitar almacenar en búfer cualquier cuerpo de contenido transmitiendo directamente al socket al servidor.
    • Flujos de entrada de respuesta para leer de manera eficiente el cuerpo de la respuesta transmitiendo directamente desde el socket al servidor.
    • Conexiones persistentes que usan KeepAlive en HTTP / 1.0 y persistencia en HTTP / 1.1
    • Acceso directo al código de respuesta y encabezados enviados por el servidor.
    • La capacidad de establecer tiempos de espera de conexión.
    • HttpMethods implementa el patrón de comando para permitir solicitudes paralelas y la reutilización eficiente de conexiones.
    • El código fuente está disponible gratuitamente bajo la licencia de software Apache.
Chris
fuente
7
+1 Gran respuesta: Gran ejemplo. Grandes puntos. Realmente vendes Apache HTTP Client.
therobyouknow
23
Sin embargo, la documentación está ACTUALIZADA. 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, tendrá que crear una instancia de una clase que implemente la interfaz HttpClient, por ejemplo, DefaultHttpClient.
therobyouknow
4
parece que cada lanzamiento implica demasiados cambios importantes ... me siento realmente frustrado con esta biblioteca a lo largo de los años ... y ahora parecen tener fugas de conexiones del grupo, que tengo un máximo de 20 configuradas ... grrrrrr .
Dean Hiller
5
Apache HttpClient parece estar en EOL ahora, con una nueva biblioteca Apache disponible.
Andrew Aylett
17
Estimados votantes en contra, esta respuesta se creó hace casi 5 años ...
Chris
16

Soy algo parcial a Jersey . Usamos 1.10 en todos nuestros proyectos y no hemos encontrado ningún problema que no pudiéramos resolver con él.

Algunas razones por las que me gusta:

  • Proveedores: crearon proveedores de jabón 1.1 / 1.2 en Jersey y eliminaron la necesidad de utilizar el voluminoso AXIS para nuestras llamadas JAX-WS
  • Filtros: filtros de registro de base de datos creados para registrar toda la solicitud (incluidos los encabezados de solicitud / respuesta) mientras se evita el registro de información confidencial.
  • JAXB: admite la clasificación hacia / desde objetos directamente desde la solicitud / respuesta
  • API es fácil de usar

De hecho, HTTPClient y Jersey son muy similares en implementación y 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 Client: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

ElMattIO
fuente
11

Estoy de acuerdo en que httpclient es una especie de estándar, pero supongo que está buscando opciones, así que ...

Restlet proporciona un cliente http especialmente diseñado para interactuar con los servicios web de Restful.

Código de 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);

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

Pablojim
fuente
6

¿Puedo recomendarle 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 de maven

<dependency>
    <groupId>net.sf.corn</groupId>
    <artifactId>corn-httpclient</artifactId>
    <version>1.0.0</version>
</dependency>
Serhat
fuente
5

Quiero mencionar la biblioteca cliente Ning Async Http . Nunca lo he usado, pero mi colega lo aclara en comparación con el Apache Http Client, que siempre he usado en el pasado. Me interesó especialmente saber que se basa en Netty , el marco de E / S asincrónico de alto rendimiento, con el que estoy más familiarizado y tengo una gran estima.

Josh
fuente