Comment envoyer une requête HTTP en java? [dupliquer]

cette question a déjà une réponse ici:

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

358
demandé sur Yatendra Goel 2009-09-01 02:31:10

9 réponses

vous pouvez utiliser java.net.HttpUrlConnection .

exemple ( d'ici ), avec améliorations. Inclus dans le cas du lien rot:

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();
    }
  }
}
270
répondu duffymo 2016-07-20 16:34:44

à Partir de Oracle java tutoriel

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();
    }
}
210
répondu Chi 2014-07-25 16:20:03

je sais que d'autres recommanderont le client http D'Apache, mais il ajoute de la complexité (i.e., plus de choses qui peuvent mal tourner) 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();
}
63
répondu erickson 2009-08-31 22:38:53

Apache Httpcomposants . Les exemples pour les deux modules - HttpCore et HttpClient vous permettront de commencer tout de suite.

non pas que la connexion HttpUrlConnection soit un mauvais choix, Les composants Httpcomposeront une grande partie du codage fastidieux. Je recommande ceci, si vous voulez vraiment prendre en charge un grand nombre de serveurs/clients HTTP avec un code minimum. Au fait, HttpCore pourrait être utilisé pour des applications (clients ou serveurs) avec des fonctionnalités minimales, tandis que HttpClient doit être utilisé pour les clients qui ont besoin de prise en charge de plusieurs schémas d'authentification, prise en charge des cookies, etc.

54
répondu Vineet Reynolds 2013-01-11 18:12:17

voici un programme Java 7 complet:

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

le nouveau try-with-resources fermera automatiquement le Scanner, qui fermera automatiquement le flux entrant.

23
répondu Janus Troelsen 2013-07-14 14:57:32

Google java http client possède une bonne API pour les requêtes http. Vous pouvez facilement ajouter le support JSON, etc. Bien que pour une simple requête il pourrait être exagéré.

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
répondu Tombart 2014-02-10 15:56:33

cela vous aidera. N'oubliez pas d'ajouter le bocal 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@email.com");

        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();
        }
    }
}
12
répondu Satish Sharma 2012-10-20 19:16:22

vous pouvez utiliser Socket pour ce 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
répondu laksys 2015-04-18 14:02:06

Il ya un grand lien sur l'envoi d'une demande de poste 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 en fonction de vos besoins. Spécifiquement, vous devez ajouter les paramètres à l'intérieur du constructeur de L'URL. Puis, aussi commenter ce wr.write(data);

une chose qui n'est pas écrite et dont vous devez vous méfier, c'est les temps morts. Surtout si vous voulez l'utiliser dans WebServices vous devez définir les délais, sinon le code ci-dessus va attendre indéfiniment ou pour un temps très long, au moins, et c'est quelque chose que sans doute vous ne voulez pas.

délais d'attente sont définies comme cette conn.setReadTimeout(2000); le paramètre d'entrée est en millisecondes

7
répondu tzik 2013-10-20 11:40:52