Comment utiliser java. net. URLConnection pour déclencher et gérer les requêtes HTTP


Utilisation de java.net.URLConnection demande assez souvent ici, et la Oracle tutoriel est aussi concis sur elle.

Ce tutoriel montre essentiellement seulement comment déclencher une demande GET et lire la réponse. Il n'explique nulle part comment l'utiliser pour, entre autres, effectuer une demande POST, définir des en-têtes de demande, lire des en-têtes de réponse, gérer les cookies, soumettre un formulaire HTML, télécharger un fichier, etc.

Alors, comment puis-je utiliser {[0] } pour déclencher et gérer HTTP "avancé" les demandes?

Author: BalusC, 2010-05-08

11 answers

D'abord un avertissement à l'avance: les extraits de code publiés sont tous des exemples de base. Vous aurez besoin de gérer les IOExceptiontriviaux et RuntimeExceptioncomme NullPointerException, ArrayIndexOutOfBoundsException et se consort.


Préparation

Nous devons d'abord connaître au moins l'URL et le jeu de caractères. Les paramètres sont facultatifs et dépendent des exigences fonctionnelles.

String url = "http://example.com";
String charset = "UTF-8";  // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name()
String param1 = "value1";
String param2 = "value2";
// ...

String query = String.format("param1=%s&param2=%s", 
     URLEncoder.encode(param1, charset), 
     URLEncoder.encode(param2, charset));

Les paramètres de requête doivent être au format name=value et être concaténés par &. Vous le feriez normalement aussi encoder les paramètres de la requête avec le jeu de caractères spécifié URLEncoder#encode().

Le String#format() est juste pour plus de commodité. Je le préfère quand j'aurais besoin de l'opérateur de concaténation de chaînes + plus de deux fois.


Lancer une requête HTTP GET avec (éventuellement) des paramètres de requête

C'est une tâche triviale. C'est la méthode de requête par défaut.

URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...

Toute chaîne de requête doit être concaténée à l'URL en utilisant ?. Le Accept-Charset l'en-tête peut indiquer au serveur dans quel codage se trouvent les paramètres. Si vous n'envoyez aucune chaîne de requête, vous pouvez laisser l'en-tête Accept-Charset. Si vous n'avez pas besoin de définir les en-têtes, vous pouvez même utiliser l'URL#openStream() méthode raccourci.

InputStream response = new URL(url).openStream();
// ...

De toute façon, si l'autre côté est un HttpServlet, puis, à son doGet() méthode sera appelée avec les paramètres seront disponibles par HttpServletRequest#getParameter().

Pour les tests fins, vous pouvez imprimer le corps de la réponse à stdout comme ci-dessous:

try (Scanner scanner = new Scanner(response)) {
    String responseBody = scanner.useDelimiter("\\A").next();
    System.out.println(responseBody);
}

Lancer une requête HTTP POST avec des paramètres de requête

Réglage de la URLConnection#setDoOutput() de true, implicitement, fixe la méthode de demande de POSTE. Le POST HTTP standard comme le font les formulaires Web est de type application/x-www-form-urlencoded dans lequel la chaîne de requête est écrite dans le corps de la requête.

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); // Triggers POST.
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);

try (OutputStream output = connection.getOutputStream()) {
    output.write(query.getBytes(charset));
}

InputStream response = connection.getInputStream();
// ...

Remarque: chaque fois que vous souhaitez soumettre un formulaire HTML par programme, n'oubliez pas de prendre les name=value paires de tous les éléments <input type="hidden"> dans la chaîne de requête et bien sûr aussi la paire name=value de l'élément <input type="submit"> que vous souhaitez "appuyer" par programme (car cela est généralement utilisé côté serveur pour distinguer si un bouton a été enfoncé et si oui, lequel).

Vous pouvez également associer des de la obtenu URLConnection pour HttpURLConnection et l'utilisation de son HttpURLConnection#setRequestMethod() au lieu de cela. Mais si vous essayez d'utiliser la connexion pour la sortie, vous devez encore définir URLConnection#setDoOutput() pour true.

HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
httpConnection.setRequestMethod("POST");
// ...

De toute façon, si l'autre côté est un HttpServlet, puis, à son doPost() méthode sera appelée avec les paramètres seront disponibles par HttpServletRequest#getParameter().


En train de lancer la requête HTTP

Vous pouvez lancer la requête HTTP explicitement avec URLConnection#connect(), mais la demande sera automatiquement déclenchée à la demande lorsque vous souhaitez obtenir des informations sur la réponse HTTP, telles que le corps de la réponse en utilisant URLConnection#getInputStream() et ainsi de suite. Les exemples ci-dessus font exactement cela, donc l'appel connect() est en fait superflu.


Collecte des informations de réponse HTTP

  1. Statut de réponse HTTP:

    Vous avez besoin d'un HttpURLConnection ici. Il la jeta d'abord si nécessaire.

    int status = httpConnection.getResponseCode();
    
  2. En-têtes de réponse HTTP:

    for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
        System.out.println(header.getKey() + "=" + header.getValue());
    }
    
  3. Encodage de réponse HTTP:

    Lorsque le Content-Type contient un paramètre charset, alors le corps de la réponse est probablement basé sur du texte et nous aimerions traiter le corps de la réponse avec le codage de caractères spécifié côté serveur.

    String contentType = connection.getHeaderField("Content-Type");
    String charset = null;
    
    for (String param : contentType.replace(" ", "").split(";")) {
        if (param.startsWith("charset=")) {
            charset = param.split("=", 2)[1];
            break;
        }
    }
    
    if (charset != null) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(response, charset))) {
            for (String line; (line = reader.readLine()) != null;) {
                // ... System.out.println(line) ?
            }
        }
    } else {
        // It's likely binary content, use InputStream/OutputStream.
    }
    

Maintien de la session

La session côté serveur est généralement soutenue par un cookie. Certains formulaires Web exigent que vous soyez connecté et / ou que vous soyez suivi par une session. Vous pouvez utiliser le CookieHandler API pour maintenir les cookies. Vous avez besoin pour préparer un CookieManager avec un CookiePolicy de ACCEPT_ALL avant d'envoyer toutes les requêtes HTTP.

// First set the default cookie manager.
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

// All the following subsequent URLConnections will use the same cookie manager.
URLConnection connection = new URL(url).openConnection();
// ...

connection = new URL(url).openConnection();
// ...

connection = new URL(url).openConnection();
// ...

Notez que cela est connu pour ne pas toujours fonctionner correctement en toutes circonstances. Si cela échoue pour vous, le mieux est de rassembler et de définir manuellement les en-têtes de cookies. Vous devez essentiellement récupérer tous les en-têtes Set-Cookie de la réponse de la connexion ou de la première demande GET, puis le transmettre aux demandes suivantes.

// Gather all cookies on the first request.
URLConnection connection = new URL(url).openConnection();
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
// ...

// Then use the same cookies on all subsequent requests.
connection = new URL(url).openConnection();
for (String cookie : cookies) {
    connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
}
// ...

Le {[61] } est là pour se débarrasser des attributs de cookie qui sont non pertinent pour le côté serveur comme expires, path, etc. Alternativement, vous pouvez également utiliser cookie.substring(0, cookie.indexOf(';')) au lieu de split().


Mode de diffusion

Le HttpURLConnection par défaut, tamponnera le corps entier de la requête avant de l'envoyer, que vous ayez défini vous-même une longueur de contenu fixe en utilisant connection.setRequestProperty("Content-Length", contentLength);. Cela peut provoquer OutOfMemoryException s chaque fois que vous envoyez simultanément de grandes demandes de publication (par exemple, le téléchargement de fichiers). Pour éviter cela, vous souhaitez définir le HttpURLConnection#setFixedLengthStreamingMode().

httpConnection.setFixedLengthStreamingMode(contentLength);

Mais si la longueur du contenu n'est vraiment pas connue à l'avance, vous pouvez utiliser le mode de streaming en morceaux en définissant le HttpURLConnection#setChunkedStreamingMode() en conséquence. Cela va définir le HTTP Transfer-Encoding en-tête à chunked qui forcera l'envoi du corps de la requête en morceaux. L'exemple ci-dessous enverra le corps en morceaux de 1 Ko.

httpConnection.setChunkedStreamingMode(1024);

Agent utilisateur

Il peut arriver que une requête renvoie une réponse inattendue, alors que cela fonctionne bien avec un vrai navigateur Web. Le côté serveur bloque probablement les demandes basées sur le User-Agent en-tête de demande. Le URLConnection le définira par défaut sur Java/1.6.0_19 où la dernière partie est évidemment la version JRE. Vous pouvez remplacer ceci comme suit:

connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); // Do as if you're using Chrome 41 on Windows 7.

Utilisez la chaîne User-Agent d'unnavigateur récent .


Gestion des erreurs

Si le code de réponse HTTP est 4nn (Erreur client) ou 5nn (Erreur serveur), vous pouvez vous voulez lire le HttpURLConnection#getErrorStream() pour voir si le serveur a envoyé des informations d'erreur utiles.

InputStream error = ((HttpURLConnection) connection).getErrorStream();

Si le code de réponse HTTP est -1, alors quelque chose s'est mal passé avec la connexion et la gestion des réponses. L'implémentation HttpURLConnection est dans les anciens JREs quelque peu boguée avec le maintien des connexions vivantes. Vous pouvez le désactiver en définissant la propriété système http.keepAlive sur false. Vous pouvez le faire par programmation au début de votre application en:

System.setProperty("http.keepAlive", "false");

Téléchargement fichiers

Vous utiliseriez normalementmultipart/form-data encodage pour le contenu de poste mixte (données binaires et de caractères). Le codage est décrit plus en détail dans RFC2388.

String param = "value";
File textFile = new File("/path/to/file.txt");
File binaryFile = new File("/path/to/file.bin");
String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
String CRLF = "\r\n"; // Line separator required by multipart/form-data.
URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

try (
    OutputStream output = connection.getOutputStream();
    PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
) {
    // Send normal param.
    writer.append("--" + boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF);
    writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
    writer.append(CRLF).append(param).append(CRLF).flush();

    // Send text file.
    writer.append("--" + boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"textFile\"; filename=\"" + textFile.getName() + "\"").append(CRLF);
    writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); // Text file itself must be saved in this charset!
    writer.append(CRLF).flush();
    Files.copy(textFile.toPath(), output);
    output.flush(); // Important before continuing with writer!
    writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary.

    // Send binary file.
    writer.append("--" + boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF);
    writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
    writer.append("Content-Transfer-Encoding: binary").append(CRLF);
    writer.append(CRLF).flush();
    Files.copy(binaryFile.toPath(), output);
    output.flush(); // Important before continuing with writer!
    writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary.

    // End of multipart/form-data.
    writer.append("--" + boundary + "--").append(CRLF).flush();
}

Si l'autre côté est un HttpServlet, puis, à son doPost() méthode sera appelée, et les pièces seront disponibles en HttpServletRequest#getPart() (remarque, donc pas getParameter() et ainsi de suite!). La méthode getPart() est cependant relativement nouvelle, elle est introduite dans Servlet 3.0 (Glassfish 3, Tomcat 7, etc). Avant Servlet 3.0, votre meilleur choix est d'utiliser Apache Commons FileUpload pour analyser une requête multipart/form-data. Voir aussi cette réponse pour des exemples des approches FileUpload et Servelt 3.0.


Traitement de sites HTTPS non fiables ou mal configurés

Parfois, vous devez connecter une URL HTTPS, peut-être parce que vous écrivez un grattoir Web. Dans ce cas, vous pouvez probablement faire face à un javax.net.ssl.SSLException: Not trusted server certificate sur certains sites HTTPS qui ne garde pas leurs certificats SSL à jour, ou un java.security.cert.CertificateException: No subject alternative DNS name matching [hostname] found ou javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name sur certains sites HTTPS mal configurés.

L'initialiseur à exécution unique static suivant dans votre classe web scraper devrait rendre HttpsURLConnection plus indulgent quant à ces sites HTTPS et donc ne plus lever ces exceptions.

static {
    TrustManager[] trustAllCertificates = new TrustManager[] {
        new X509TrustManager() {
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null; // Not relevant.
            }
            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                // Do nothing. Just allow them all.
            }
            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                // Do nothing. Just allow them all.
            }
        }
    };

    HostnameVerifier trustAllHostnames = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true; // Just allow them all.
        }
    };

    try {
        System.setProperty("jsse.enableSNIExtension", "false");
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCertificates, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(trustAllHostnames);
    }
    catch (GeneralSecurityException e) {
        throw new ExceptionInInitializerError(e);
    }
}

Derniers mots

Le Apache HttpComponents HttpClient est beaucoup plus pratique dans ce tous :)


Analyse et extraction du HTML

Si tout ce que vous voulez est l'analyse et l'extraction de données à partir de HTML, alors mieux utiliser un analyseur HTML comme Jsoup

 2552
Author: BalusC, 2018-07-26 12:14:04

Lorsque vous travaillez avec HTTP, il est presque toujours plus utile de se référer à HttpURLConnection plutôt qu'à la classe de base URLConnection (puisque URLConnection est une classe abstraite lorsque vous demandez URLConnection.openConnection() sur une URL HTTP, c'est ce que vous récupérerez de toute façon).

Alors vous pouvez au lieu de compter sur URLConnection#setDoOutput(true) pour définir implicitement la méthode de requête sur POST à la place faire httpURLConnection.setRequestMethod("POST") que certains pourraient trouver plus naturel (et qui vous permet également de spécifier d'autres méthodes de requête telles que PUT, SUPPRIMER, ...).

Il fournit également des constantes HTTP utiles afin que vous puissiez faire:

int responseCode = httpURLConnection.getResponseCode();

if (responseCode == HttpURLConnection.HTTP_OK) {
 86
Author: Paal Thorstensen, 2013-12-17 00:24:55

Inspiré par cette question et d'autres sur SO, j'ai créé un open source minimalbasic-http-client qui incarne la plupart des techniques trouvées ici.

Google-http-java-client est également une excellente ressource open source.

 49
Author: David Chandler, 2012-06-13 16:37:47

Il y a 2 options que vous pouvez utiliser avec les résultats d'URL HTTP: GET / POST

OBTENIR la demande: -

HttpURLConnection.setFollowRedirects(true); // defaults to true

String url = "https://name_of_the_url";
URL request_url = new URL(url);
HttpURLConnection http_conn = (HttpURLConnection)request_url.openConnection();
http_conn.setConnectTimeout(100000);
http_conn.setReadTimeout(100000);
http_conn.setInstanceFollowRedirects(true);
System.out.println(String.valueOf(http_conn.getResponseCode()));

Requête POST : -

HttpURLConnection.setFollowRedirects(true); // defaults to true

String url = "https://name_of_the_url"
URL request_url = new URL(url);
HttpURLConnection http_conn = (HttpURLConnection)request_url.openConnection();
http_conn.setConnectTimeout(100000);
http_conn.setReadTimeout(100000);
http_conn.setInstanceFollowRedirects(true);
http_conn.setDoOutput(true);
PrintWriter out = new PrintWriter(http_conn.getOutputStream());
if (urlparameter != null) {
   out.println(urlparameter);
}
out.close();
out = null;
System.out.println(String.valueOf(http_conn.getResponseCode()));
 22
Author: Utkash Bhatt, 2017-05-05 16:40:31

Je vous suggère de jeter un oeil au code sur kevinsawicki/http-request, c'est essentiellement un wrapper au-dessus de HttpUrlConnection il fournit une API beaucoup plus simple au cas où vous voudriez simplement faire les demandes en ce moment ou vous pouvez jeter un oeil aux sources (ce n'est pas trop grand) pour jeter un

Exemple: Faire une requête GET avec le type de contenu application/json et certains paramètres de requête:

// GET http://google.com?q=baseball%20gloves&size=100
String response = HttpRequest.get("http://google.com", true, "q", "baseball gloves", "size", 100)
        .accept("application/json")
        .body();
System.out.println("Response was: " + response);
 20
Author: fernandohur, 2014-11-24 13:43:51

J'ai également été très inspiré par cette réponse.

Je suis souvent sur des projets où j'ai besoin de faire du HTTP, et je ne veux peut-être pas apporter beaucoup de dépendances tierces (qui en apportent d'autres, etc.), etc.)

J'ai commencé à écrire mes propres utilitaires basés sur une partie de cette conversation (pas n'importe où fait):

package org.boon.utils;


import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;

import static org.boon.utils.IO.read;

public class HTTP {

Alors il y a juste un tas ou des méthodes statiques.

public static String get(
        final String url) {

    Exceptions.tryIt(() -> {
        URLConnection connection;
        connection = doGet(url, null, null, null);
        return extractResponseString(connection);
    });
    return null;
}

public static String getWithHeaders(
        final String url,
        final Map<String, ? extends Object> headers) {
    URLConnection connection;
    try {
        connection = doGet(url, headers, null, null);
        return extractResponseString(connection);
    } catch (Exception ex) {
        Exceptions.handle(ex);
        return null;
    }
}

public static String getWithContentType(
        final String url,
        final Map<String, ? extends Object> headers,
        String contentType) {
    URLConnection connection;
    try {
        connection = doGet(url, headers, contentType, null);
        return extractResponseString(connection);
    } catch (Exception ex) {
        Exceptions.handle(ex);
        return null;
    }
}
public static String getWithCharSet(
        final String url,
        final Map<String, ? extends Object> headers,
        String contentType,
        String charSet) {
    URLConnection connection;
    try {
        connection = doGet(url, headers, contentType, charSet);
        return extractResponseString(connection);
    } catch (Exception ex) {
        Exceptions.handle(ex);
        return null;
    }
}

Puis poster...

public static String postBody(
        final String url,
        final String body) {
    URLConnection connection;
    try {
        connection = doPost(url, null, "text/plain", null, body);
        return extractResponseString(connection);
    } catch (Exception ex) {
        Exceptions.handle(ex);
        return null;
    }
}

public static String postBodyWithHeaders(
        final String url,
        final Map<String, ? extends Object> headers,
        final String body) {
    URLConnection connection;
    try {
        connection = doPost(url, headers, "text/plain", null, body);
        return extractResponseString(connection);
    } catch (Exception ex) {
        Exceptions.handle(ex);
        return null;
    }
}



public static String postBodyWithContentType(
        final String url,
        final Map<String, ? extends Object> headers,
        final String contentType,
        final String body) {

    URLConnection connection;
    try {
        connection = doPost(url, headers, contentType, null, body);


        return extractResponseString(connection);


    } catch (Exception ex) {
        Exceptions.handle(ex);
        return null;
    }


}


public static String postBodyWithCharset(
        final String url,
        final Map<String, ? extends Object> headers,
        final String contentType,
        final String charSet,
        final String body) {

    URLConnection connection;
    try {
        connection = doPost(url, headers, contentType, charSet, body);


        return extractResponseString(connection);


    } catch (Exception ex) {
        Exceptions.handle(ex);
        return null;
    }


}

private static URLConnection doPost(String url, Map<String, ? extends Object> headers,
                                    String contentType, String charset, String body
                                    ) throws IOException {
    URLConnection connection;/* Handle output. */
    connection = new URL(url).openConnection();
    connection.setDoOutput(true);
    manageContentTypeHeaders(contentType, charset, connection);

    manageHeaders(headers, connection);


    IO.write(connection.getOutputStream(), body, IO.CHARSET);
    return connection;
}

private static void manageHeaders(Map<String, ? extends Object> headers, URLConnection connection) {
    if (headers != null) {
        for (Map.Entry<String, ? extends Object> entry : headers.entrySet()) {
            connection.setRequestProperty(entry.getKey(), entry.getValue().toString());
        }
    }
}

private static void manageContentTypeHeaders(String contentType, String charset, URLConnection connection) {
    connection.setRequestProperty("Accept-Charset", charset == null ? IO.CHARSET : charset);
    if (contentType!=null && !contentType.isEmpty()) {
        connection.setRequestProperty("Content-Type", contentType);
    }
}

private static URLConnection doGet(String url, Map<String, ? extends Object> headers,
                                    String contentType, String charset) throws IOException {
    URLConnection connection;/* Handle output. */
    connection = new URL(url).openConnection();
    manageContentTypeHeaders(contentType, charset, connection);

    manageHeaders(headers, connection);

    return connection;
}

private static String extractResponseString(URLConnection connection) throws IOException {
/* Handle input. */
    HttpURLConnection http = (HttpURLConnection)connection;
    int status = http.getResponseCode();
    String charset = getCharset(connection.getHeaderField("Content-Type"));

    if (status==200) {
        return readResponseBody(http, charset);
    } else {
        return readErrorResponseBody(http, status, charset);
    }
}

private static String readErrorResponseBody(HttpURLConnection http, int status, String charset) {
    InputStream errorStream = http.getErrorStream();
    if ( errorStream!=null ) {
        String error = charset== null ? read( errorStream ) :
            read( errorStream, charset );
        throw new RuntimeException("STATUS CODE =" + status + "\n\n" + error);
    } else {
        throw new RuntimeException("STATUS CODE =" + status);
    }
}

private static String readResponseBody(HttpURLConnection http, String charset) throws IOException {
    if (charset != null) {
        return read(http.getInputStream(), charset);
    } else {
        return read(http.getInputStream());
    }
}

private static String getCharset(String contentType) {
    if (contentType==null)  {
        return null;
    }
    String charset = null;
    for (String param : contentType.replace(" ", "").split(";")) {
        if (param.startsWith("charset=")) {
            charset = param.split("=", 2)[1];
            break;
        }
    }
    charset = charset == null ?  IO.CHARSET : charset;

    return charset;
}

Eh bien, vous avez l'idée....

Voici les essais:

static class MyHandler implements HttpHandler {
    public void handle(HttpExchange t) throws IOException {

        InputStream requestBody = t.getRequestBody();
        String body = IO.read(requestBody);
        Headers requestHeaders = t.getRequestHeaders();
        body = body + "\n" + copy(requestHeaders).toString();
        t.sendResponseHeaders(200, body.length());
        OutputStream os = t.getResponseBody();
        os.write(body.getBytes());
        os.close();
    }
}


@Test
public void testHappy() throws Exception {

    HttpServer server = HttpServer.create(new InetSocketAddress(9212), 0);
    server.createContext("/test", new MyHandler());
    server.setExecutor(null); // creates a default executor
    server.start();

    Thread.sleep(10);


    Map<String,String> headers = map("foo", "bar", "fun", "sun");

    String response = HTTP.postBodyWithContentType("http://localhost:9212/test", headers, "text/plain", "hi mom");

    System.out.println(response);

    assertTrue(response.contains("hi mom"));
    assertTrue(response.contains("Fun=[sun], Foo=[bar]"));


    response = HTTP.postBodyWithCharset("http://localhost:9212/test", headers, "text/plain", "UTF-8", "hi mom");

    System.out.println(response);

    assertTrue(response.contains("hi mom"));
    assertTrue(response.contains("Fun=[sun], Foo=[bar]"));

    response = HTTP.postBodyWithHeaders("http://localhost:9212/test", headers, "hi mom");

    System.out.println(response);

    assertTrue(response.contains("hi mom"));
    assertTrue(response.contains("Fun=[sun], Foo=[bar]"));


    response = HTTP.get("http://localhost:9212/test");

    System.out.println(response);


    response = HTTP.getWithHeaders("http://localhost:9212/test", headers);

    System.out.println(response);

    assertTrue(response.contains("Fun=[sun], Foo=[bar]"));



    response = HTTP.getWithContentType("http://localhost:9212/test", headers, "text/plain");

    System.out.println(response);

    assertTrue(response.contains("Fun=[sun], Foo=[bar]"));



    response = HTTP.getWithCharSet("http://localhost:9212/test", headers, "text/plain", "UTF-8");

    System.out.println(response);

    assertTrue(response.contains("Fun=[sun], Foo=[bar]"));

    Thread.sleep(10);

    server.stop(0);


}

@Test
public void testPostBody() throws Exception {

    HttpServer server = HttpServer.create(new InetSocketAddress(9220), 0);
    server.createContext("/test", new MyHandler());
    server.setExecutor(null); // creates a default executor
    server.start();

    Thread.sleep(10);


    Map<String,String> headers = map("foo", "bar", "fun", "sun");

    String response = HTTP.postBody("http://localhost:9220/test", "hi mom");

    assertTrue(response.contains("hi mom"));


    Thread.sleep(10);

    server.stop(0);


}

@Test(expected = RuntimeException.class)
public void testSad() throws Exception {

    HttpServer server = HttpServer.create(new InetSocketAddress(9213), 0);
    server.createContext("/test", new MyHandler());
    server.setExecutor(null); // creates a default executor
    server.start();

    Thread.sleep(10);


    Map<String,String> headers = map("foo", "bar", "fun", "sun");

    String response = HTTP.postBodyWithContentType("http://localhost:9213/foo", headers, "text/plain", "hi mom");

    System.out.println(response);

    assertTrue(response.contains("hi mom"));
    assertTrue(response.contains("Fun=[sun], Foo=[bar]"));

    Thread.sleep(10);

    server.stop(0);


}

, Vous pouvez trouver le reste ici:

Https://github.com/RichardHightower/boon

Mon but est de fournir les choses communes que l'on voudrait faire d'une manière un peu plus facile alors....

 19
Author: RickHigh, 2013-10-17 05:35:17

Mise à jour

Le nouveau client HTTP livré avec Java 9 mais dans le cadre d'un Module incubateur nommé jdk.incubator.httpclient. Les modules incubateurs sont un moyen de mettre les API non finales entre les mains des développeurs tout en Les API progressent vers la finalisation ou la suppression à l'avenir publier.

Dans Java 9, vous pouvez envoyer une requête GET comme:

// GET
HttpResponse response = HttpRequest
    .create(new URI("http://www.stackoverflow.com"))
    .headers("Foo", "foovalue", "Bar", "barvalue")
    .GET()
    .response();

Ensuite, vous pouvez examiner le HttpResponse retourné:

int statusCode = response.statusCode();
String responseBody = response.body(HttpResponse.asString());

Puisque ce nouveau client HTTP est java.httpclient Module jdk.incubator.httpclient, vous devez déclarer cette dépendance dans votre fichier module-info.java:

module com.foo.bar {
    requires jdk.incubator.httpclient;
}
 16
Author: Ali Dehghani, 2017-11-30 15:16:39

Au départ, j'ai été induit en erreur par cet article qui favorise HttpClient.

Plus Tard, j'ai réalisé que HttpURLConnection va rester de cette article

Selon le blog de Google:

Le client HTTP Apache a moins de bugs sur Eclair et Froyo. C'est le meilleur choix pour ces versions. Pour le pain d'épice , HttpURLConnection est le meilleur choix. Son API simple et sa petite taille le rendent idéal pour Android.

Compression transparente et la mise en cache des réponses réduit l'utilisation du réseau, améliore la vitesse et économise la batterie. Les nouvelles applications devraient utiliser HttpURLConnection; c'est là que nous dépenserons notre énergie à l'avenir.

Après avoir lu cet article et d'autres questions de pile sur flux, je suis convaincu que HttpURLConnection va rester plus longtemps.

Quelques-unes des questions SE favorisant HttpURLConnections:

Sur Android, effectuez une requête POST avec des données de formulaire codées par URL sans utiliser UrlEncodedFormEntity

HttpPost travaille dans le projet Java, pas dans Android

 14
Author: Ravindra babu, 2017-05-23 11:55:13

Vous pouvez également utiliser JdkRequest de jcabi-http (je suis un développeur), qui fait tout ce travail pour vous, décorant HttpURLConnection, déclenchant des requêtes HTTP et analysant les réponses, par exemple:

String html = new JdkRequest("http://www.google.com").fetch().body();

Consultez cet article de blog pour plus d'informations: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

 11
Author: yegor256, 2014-04-11 18:54:16

Il y a aussi OkHttp , qui est un client HTTP efficace par défaut:

  • La prise en charge de HTTP/2 permet à toutes les requêtes adressées au même hôte de partager un socket.
  • Le regroupement de connexions réduit la latence des requêtes (si HTTP/2 n'est pas disponible).
  • Transparent GZIP rétrécit les tailles de téléchargement.
  • La mise en cache des réponses évite complètement le réseau pour les demandes répétées.

Créez d'abord une instance de OkHttpClient:

OkHttpClient client = new OkHttpClient();

Ensuite, préparez votre demande GET:

Request request = new Request.Builder()
      .url(url)
      .build();

Enfin, utilisez OkHttpClient pour envoyer Request préparé:

Response response = client.newCall(request).execute();

Pour plus de détails, vous pouvez consulter la documentation OkHttp

 11
Author: Ali Dehghani, 2016-01-15 12:06:33

Si vous utilisez http get veuillez supprimer cette ligne

urlConnection.setDoOutput(true);
 10
Author: Nison Cheruvathur, 2017-12-20 07:15:18