如何在Java中发送HTTP请求?

在Java中,如何编写HTTP请求消息并将其发送到HTTP WebServer?

你可以使用java.net.HttpUrlConnection 。

示例( 从这里 ),改进。 包括在链接腐烂的情况下:

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

从Oracle的java教程

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

我知道其他人会推荐Apache的http客户端,但它增加了复杂性(即更多的事情可能出错),这是很less的保证。 对于一个简单的任务, 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 。 这两个模块的例子–HttpCore和HttpClient会让你马上开始。

不是说HttpUrlConnection是一个不好的select,HttpComponents会把很多繁琐的代码抽象出来。 我会推荐这个,如果你真的想用最less的代码来支持很多的HTTP服务器/客户端。 顺便说一下,HttpCore可以用于具有最小function的应用程序(客户端或服务器),而HttpClient则用于需要支持多种authenticationscheme,支持cookie的客户端。

这是一个完整的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()); } } } 

新的试用资源将自动closures扫描仪,它将自动closuresInputStream。

这将帮助你。 不要忘记将JAR HttpClient.jar添加到类path中。

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

谷歌的Java HTTP客户端有很好的HTTP请求的API。 您可以轻松添加JSON支持等。虽然对于简单的请求,它可能是矫枉过正。

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

你可以像这样使用Socket

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

Example Depot中有一个关于发送POST请求的很好的链接::

 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) { } 

如果您想发送GET请求,您可以稍微修改代码以满足您的需求。 具体来说,您必须在URL的构造函数中添加参数。 然后,也注释掉这个wr.write(data);

有一件事没有写,你应该提防,是超时。 特别是如果你想在WebServices中使用它,你必须设置超时,否则上面的代码将无限期地等待或至less很长一段时间,这可能是你不想要的。

超时设置像这样conn.setReadTimeout(2000); input参数以毫秒为单位