webentwicklung-frage-antwort-db.com.de

Wie versende ich eine HTTP-Anfrage in Java?

Wie erstelle ich in Java eine HTTP-Anforderungsnachricht und sende sie an einen HTTP-WebServer?

388
Yatendra Goel

Sie können Java.net.HttpUrlConnection verwenden.

Beispiel ( von hier ), mit Verbesserungen. Im Falle von Link Rot enthalten:

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

From Oracle's Java Tutorial

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

Ich weiß, dass andere den http-client von Apache empfehlen werden, aber er erhöht die Komplexität (d. H. Mehr Dinge, die schief gehen können), was selten gerechtfertigt ist. Für eine einfache Aufgabe reicht Java.net.URL.

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 . Mit den Beispielen für die beiden Module - HttpCore und HttpClient können Sie sofort loslegen.

Nicht dass HttpUrlConnection eine schlechte Wahl ist, HttpComponents wird einen Großteil des langwierigen Programmierens wegnehmen. Ich würde dies empfehlen, wenn Sie wirklich viele HTTP-Server/-Clients mit minimalem Code unterstützen möchten. Übrigens könnte HttpCore für Anwendungen (Clients oder Server) mit minimaler Funktionalität verwendet werden, während HttpClient für Clients verwendet werden soll, die Unterstützung für mehrere Authentifizierungsschemata, Cookie-Unterstützung usw. benötigen.

55
Vineet Reynolds

Hier ist ein vollständiges Programm für 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());
    }
  }
}

Durch den neuen Versuch mit Ressourcen wird der Scanner automatisch geschlossen, wodurch der InputStream automatisch geschlossen wird.

25
Janus Troelsen

Das wird dir helfen. Vergessen Sie nicht, das JAR HttpClient.jar zum Klassenpfad hinzuzufügen.

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 Java http client hat eine nette API für http-Anfragen. Sie können ganz einfach JSON-Unterstützung usw. hinzufügen. Bei einfachen Anforderungen kann es jedoch zu einem Overkill kommen.

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

Sie können dafür Socket verwenden

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

Es gibt einen großartigen Link zum Senden einer POST -Anforderung hier von Example 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) {
}

Wenn Sie eine GET-Anfrage senden möchten, können Sie den Code leicht an Ihre Bedürfnisse anpassen. Insbesondere müssen Sie die Parameter im Konstruktor der URL hinzufügen. Kommentieren Sie dann auch dieses wr.write(data); aus.

Eine Sache, die nicht geschrieben wurde und auf die Sie achten sollten, sind die Timeouts. Vor allem, wenn Sie es in WebServices verwenden möchten, müssen Sie Timeouts festlegen, da der obige Code sonst auf unbestimmte Zeit oder zumindest sehr lange wartet und Sie dies vermutlich nicht möchten.

Timeouts werden wie folgt eingestellt: conn.setReadTimeout(2000); Der Eingabeparameter wird in Millisekunden angegeben

7
tzik