Quelle est la meilleure bibliothèque Java à utiliser pour HTTP POST, GET, etc.? [fermé]

97

Quelle est la meilleure bibliothèque Java à utiliser pour HTTP POST, GET etc. en termes de performances, de stabilité, de maturité, etc.? Y a-t-il une bibliothèque particulière qui est utilisée plus que d'autres?

Mes besoins sont de soumettre des requêtes HTTPS POST à ​​un serveur distant. J'ai utilisé le package java.net. * Dans le passé ainsi que le package org.apache.commons.httpclient. *. Les deux ont fait le travail, mais j'aimerais avoir vos opinions / recommandations.

rmcc
la source

Réponses:

107

à mon humble avis: Client HTTP Apache

exemple d'utilisation:

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

quelques caractéristiques marquantes:

  • Basé sur des standards, Java pur, implémentation des versions HTTP 1.0 et 1.1
    • Implémentation complète de toutes les méthodes HTTP (GET, POST, PUT, DELETE, HEAD, OPTIONS et TRACE) dans un cadre OO extensible.
    • Prend en charge le cryptage avec le protocole HTTPS (HTTP sur SSL).
    • Configuration et suivi granulaires non standard.
    • Connexions transparentes via des proxys HTTP.
    • Connexions HTTPS tunnelisées via des proxys HTTP, via la méthode CONNECT.
    • Connexions transparentes via les proxies SOCKS (versions 4 et 5) utilisant le support natif de socket Java.
    • Authentification à l'aide des méthodes Basic, Digest et de cryptage NTLM (NT Lan Manager).
    • Mécanisme de plug-in pour les méthodes d'authentification personnalisées.
    • Formulaire POST en plusieurs parties pour le téléchargement de fichiers volumineux.
    • Implémentations de sockets sécurisés enfichables, facilitant l'utilisation de solutions tierces
    • Prise en charge de la gestion des connexions pour une utilisation dans les applications multithreads. Prend en charge la définition des connexions totales maximales ainsi que des connexions maximales par hôte. Détecte et ferme les connexions périmées.
    • Gestion automatique des cookies pour lire les en-têtes Set-Cookie: du serveur et les renvoyer dans un en-tête Cookie: le cas échéant.
    • Mécanisme de plug-in pour les politiques de cookies personnalisées.
    • Demandez des flux de sortie pour éviter de mettre en mémoire tampon tout corps de contenu en diffusant directement sur le socket vers le serveur.
    • Flux d'entrée de réponse pour lire efficacement le corps de la réponse en diffusant directement du socket vers le serveur.
    • Connexions persistantes utilisant KeepAlive dans HTTP / 1.0 et persistance dans HTTP / 1.1
    • Accès direct au code de réponse et aux en-têtes envoyés par le serveur.
    • La possibilité de définir des délais de connexion.
    • HttpMethods implémente le modèle de commande pour permettre des requêtes parallèles et une réutilisation efficace des connexions.
    • Le code source est disponible gratuitement sous la licence du logiciel Apache.
Chris
la source
7
+1 Excellente réponse: Excellent exemple. Grands points. Vous vendez vraiment Apache HTTP Client.
therobyouknow
23
La documentation est cependant HORS DATE. HttpClient n'est plus une classe concrète, c'est une interface, donc le code ci-dessus NE FONCTIONNE PAS car il tente d'instancier cette interface HttpClient. Au lieu de cela, vous devrez instancier une classe qui implémente l'interface HttpClient, par exemple DefaultHttpClient.
therobyouknow
4
on a l'impression que chaque version comporte trop de changements majeurs ... devenir vraiment frustré par cette bibliothèque au fil des ans .... et maintenant ils semblent fuir les connexions du pool que j'ai configuré au maximum ... grrrrrr .
Dean Hiller
5
Apache HttpClient semble être EOL maintenant, avec une nouvelle bibliothèque Apache disponible.
Andrew Aylett
17
Chers Down-Voters, cette réponse a été créée il y a presque 5 ans ...
Chris
16

Je suis un peu partisan de Jersey . Nous utilisons la version 1.10 dans tous nos projets et n'avons pas rencontré de problème que nous n'avons pas pu résoudre avec.

Quelques raisons pour lesquelles je l'aime:

  • Fournisseurs - ont créé des fournisseurs de savon 1.1 / 1.2 à Jersey et ont éliminé le besoin d'utiliser le volumineux AXIS pour nos appels JAX-WS
  • Filtres - ont créé des filtres de journalisation de base de données pour enregistrer l'ensemble de la demande (y compris les en-têtes de demande / réponse) tout en empêchant la journalisation des informations sensibles.
  • JAXB - prend en charge le marshaling vers / à partir d'objets directement à partir de la demande / réponse
  • L'API est facile à utiliser

En vérité, HTTPClient et Jersey sont très similaires dans leur implémentation et leur API. Il existe également une extension pour Jersey qui lui permet de prendre en charge HTTPClient.

Quelques exemples de code avec 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 avec Jersey Client: https://blogs.oracle.com/PavelBucek/entry/jersey_client_apache_http_client

ElMattIO
la source
11

Je suis d'accord que httpclient est une sorte de standard - mais je suppose que vous recherchez des options alors ...

Restlet fournit un client http spécialement conçu pour interagir avec les services Web Restful.

Exemple de code:

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

Voir http://www.restlet.org/ pour plus de détails

Pablojim
la source
6

Puis-je vous recommander corn-httpclient . C'est simple, rapide et suffisant pour la plupart des cas.

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

dépendance maven

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

Je veux mentionner la bibliothèque cliente Http Ning Async . Je ne l'ai jamais utilisé, mais mon collègue en raffole par rapport au client Apache Http, que j'ai toujours utilisé dans le passé. J'ai été particulièrement intéressé d'apprendre qu'il est basé sur Netty , le framework d'entrées / sorties asynchrones haute performance, avec lequel je suis plus familier et que je tiens en haute estime.

Josh
la source