Wie erstelle ich in Java eine HTTP-Anforderungsnachricht und sende sie an einen HTTP-WebServer?
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();
}
}
}
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();
}
}
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();
}
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.
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.
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();
}
}
}
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();
}
}
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();
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