web-dev-qa-db-fra.com

Comment envoyer une requête HTTP en Java?

En Java, comment composer un message de requête HTTP et l'envoyer à un serveur Web HTTP?

388
Yatendra Goel

Vous pouvez utiliser Java.net.HttpUrlConnection .

Exemple ( d'ici ), avec des améliorations. Inclus en cas de pourriture du lien:

public static String executePost(String targetURL, String urlParameters) {
  HttpURLConnection connection = null;

  try {
    //Create connection
    URL url = new URL(targetURL);
    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", 
        "application/x-www-form-urlencoded");

    connection.setRequestProperty("Content-Length", 
        Integer.toString(urlParameters.getBytes().length));
    connection.setRequestProperty("Content-Language", "en-US");  

    connection.setUseCaches(false);
    connection.setDoOutput(true);

    //Send request
    DataOutputStream wr = new DataOutputStream (
        connection.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.close();

    //Get Response  
    InputStream is = connection.getInputStream();
    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    StringBuilder response = new StringBuilder(); // or StringBuffer if Java version 5+
    String line;
    while ((line = rd.readLine()) != null) {
      response.append(line);
      response.append('\r');
    }
    rd.close();
    return response.toString();
  } catch (Exception e) {
    e.printStackTrace();
    return null;
  } finally {
    if (connection != null) {
      connection.disconnect();
    }
  }
}
291
duffymo

De tutoriel Java d'Oracle

import Java.net.*;
import Java.io.*;

public class URLConnectionReader {
    public static void main(String[] args) throws Exception {
        URL yahoo = new URL("http://www.yahoo.com/");
        URLConnection yc = yahoo.openConnection();
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                yc.getInputStream()));
        String inputLine;

        while ((inputLine = in.readLine()) != null) 
            System.out.println(inputLine);
        in.close();
    }
}
221
Chi

Je sais que d’autres recommanderont le client http d’Apache, mais cela ajoute à la complexité (c’est-à-dire à davantage de problèmes pouvant survenir) qui est rarement justifiée. Pour une tâche simple, Java.net.URL fera l'affaire.

URL url = new URL("http://www.y.com/url");
InputStream is = url.openStream();
try {
  /* Now read the retrieved document from the stream. */
  ...
} finally {
  is.close();
}
68
erickson

Apache HttpComponents . Les exemples pour les deux modules - HttpCore et HttpClient vous permettront de commencer immédiatement.

Bien que HttpUrlConnection ne soit pas un mauvais choix, HttpComponents résoudra une bonne partie du codage fastidieux. Je le recommanderais si vous voulez vraiment supporter beaucoup de serveurs/clients HTTP avec un minimum de code. Soit dit en passant, HttpCore pourrait être utilisé pour des applications (clients ou serveurs) ayant une fonctionnalité minimale, alors que HttpClient doit être utilisé pour les clients nécessitant la prise en charge de plusieurs schémas d'authentification, la prise en charge des cookies, etc.

55
Vineet Reynolds

Voici un programme complet Java 7:

class GETHTTPResource {
  public static void main(String[] args) throws Exception {
    try (Java.util.Scanner s = new Java.util.Scanner(new Java.net.URL("http://tools.ietf.org/rfc/rfc768.txt").openStream())) {
      System.out.println(s.useDelimiter("\\A").next());
    }
  }
}

Les nouvelles ressources d’essai avec fermeture fermeront automatiquement le scanner, ce qui fermera automatiquement InputStream.

25
Janus Troelsen

Cela vous aidera. N'oubliez pas d'ajouter le fichier JAR HttpClient.jar au chemin de classe.

import Java.io.FileOutputStream;
import Java.io.IOException;

import org.Apache.commons.httpclient.HttpClient;
import org.Apache.commons.httpclient.HttpStatus;
import org.Apache.commons.httpclient.NameValuePair;
import org.Apache.commons.httpclient.methods.PostMethod;

public class MainSendRequest {

     static String url =
         "http://localhost:8080/HttpRequestSample/RequestSend.jsp";

    public static void main(String[] args) {

        //Instantiate an HttpClient
        HttpClient client = new HttpClient();

        //Instantiate a GET HTTP method
        PostMethod method = new PostMethod(url);
        method.setRequestHeader("Content-type",
                "text/xml; charset=ISO-8859-1");

        //Define name-value pairs to set into the QueryString
        NameValuePair nvp1= new NameValuePair("firstName","fname");
        NameValuePair nvp2= new NameValuePair("lastName","lname");
        NameValuePair nvp3= new NameValuePair("email","[email protected]");

        method.setQueryString(new NameValuePair[]{nvp1,nvp2,nvp3});

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

            System.out.println("Status Code = "+statusCode);
            System.out.println("QueryString>>> "+method.getQueryString());
            System.out.println("Status Text>>>"
                  +HttpStatus.getStatusText(statusCode));

            //Get data as a String
            System.out.println(method.getResponseBodyAsString());

            //OR as a byte array
            byte [] res  = method.getResponseBody();

            //write to file
            FileOutputStream fos= new FileOutputStream("donepage.html");
            fos.write(res);

            //release connection
            method.releaseConnection();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }
}
14
Satish Sharma

Google client http Java a une API Nice pour les requêtes http. Vous pouvez facilement ajouter le support JSON, etc. Bien que pour une simple demande, cela puisse être excessif.

import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import Java.io.IOException;
import Java.io.InputStream;

public class Network {

    static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

    public void getRequest(String reqUrl) throws IOException {
        GenericUrl url = new GenericUrl(reqUrl);
        HttpRequest request = HTTP_TRANSPORT.createRequestFactory().buildGetRequest(url);
        HttpResponse response = request.execute();
        System.out.println(response.getStatusCode());

        InputStream is = response.getContent();
        int ch;
        while ((ch = is.read()) != -1) {
            System.out.print((char) ch);
        }
        response.disconnect();
    }
}
13
Tombart

Vous pouvez utiliser Socket pour cela comme

String Host = "www.yourhost.com";
Socket socket = new Socket(Host, 80);
String request = "GET / HTTP/1.0\r\n\r\n";
OutputStream os = socket.getOutputStream();
os.write(request.getBytes());
os.flush();

InputStream is = socket.getInputStream();
int ch;
while( (ch=is.read())!= -1)
    System.out.print((char)ch);
socket.close();    
9
laksys

Il existe un excellent lien pour envoyer une demande POST ici par exemple Depot ::

try {
    // Construct data
    String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
    data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");

    // Send data
    URL url = new URL("http://hostname:80/cgi");
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    wr.write(data);
    wr.flush();

    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
        // Process line...
    }
    wr.close();
    rd.close();
} catch (Exception e) {
}

Si vous souhaitez envoyer une demande GET, vous pouvez modifier légèrement le code pour l'adapter à vos besoins. Plus précisément, vous devez ajouter les paramètres dans le constructeur de l'URL. Ensuite, commentez également cette wr.write(data);

Une chose qui n’est pas écrite et dont vous devriez vous méfier, c’est le délai d’attente. Surtout si vous voulez l'utiliser dans WebServices, vous devez définir des délais d'expiration, sinon le code ci-dessus attendra indéfiniment ou très longtemps, du moins, et c'est probablement quelque chose que vous ne voulez pas.

Les délais d'attente sont définis comme ceci conn.setReadTimeout(2000); le paramètre d'entrée est exprimé en millisecondes.

7
tzik