在Java中发送HTTP POST请求

让我们假设这个url…

http://www.example.com/page.php?id=10 

(这里id需要在POST请求中发送)

我想发送id = 10到服务器的page.php ,它接受POST方法。

我如何从Java内部做到这一点?

我试过这个:

 URL aaa = new URL("http://www.example.com/page.php"); URLConnection ccc = aaa.openConnection(); 

但我仍然不知道如何通过POST发送它

已更新答案:

由于原始答案中的某些类在新版本的Apache HTTP组件中不推荐使用,因此我发布了此更新。

顺便说一下,您可以在这里访问更多示例的完整文档。

 HttpClient httpclient = HttpClients.createDefault(); HttpPost httppost = new HttpPost("http://www.a-domain.com/foo/"); // Request parameters and other properties. List<NameValuePair> params = new ArrayList<NameValuePair>(2); params.add(new BasicNameValuePair("param-1", "12345")); params.add(new BasicNameValuePair("param-2", "Hello!")); httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); //Execute and get the response. HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); try { // do something useful } finally { instream.close(); } } 

原始答案:

我推荐使用Apache HttpClient。 其更快,更容易实施。

 PostMethod post = new PostMethod("http://jakarata.apache.org/"); NameValuePair[] data = { new NameValuePair("user", "joe"), new NameValuePair("password", "bloggs") }; post.setRequestBody(data); // execute method and handle any error responses. ... InputStream in = post.getResponseBodyAsStream(); // handle response. 

有关更多信息,请查看此url: http : //hc.apache.org/

 String rawData = "id=10"; String type = "application/x-www-form-urlencoded"; String encodedData = URLEncoder.encode( rawData, "UTF-8" ); URL u = new URL("http://www.example.com/page.php"); HttpURLConnection conn = (HttpURLConnection) u.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty( "Content-Type", type ); conn.setRequestProperty( "Content-Length", String.valueOf(encodedData.length())); OutputStream os = conn.getOutputStream(); os.write(encodedData.getBytes()); 

在香草Java中发送POST请求很容易。 从URL开始,我们需要使用url.openConnection();将其转换为URLConnection url.openConnection(); 。 之后,我们需要将它转换为HttpURLConnection ,所以我们可以访问它的setRequestMethod()方法来设置我们的方法。 我们终于说,我们要通过连接发送数据。

 URL url = new URL("https://www.example.com/login"); URLConnection con = url.openConnection(); HttpURLConnection http = (HttpURLConnection)con; http.setRequestMethod("POST"); // PUT is another valid option http.setDoOutput(true); 

然后,我们需要说明我们要发送的内容:

发送一个简单的表单

来自http表单的普通POST具有明确的格式。 我们需要将我们的input转换成这种格式:

 Map<String,String> arguments = new HashMap<>(); arguments.put("username", "root"); arguments.put("password", "sjh76HSn!"); // This is a fake password obviously StringJoiner sj = new StringJoiner("&"); for(Map.Entry<String,String> entry : arguments.entrySet()) sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue(), "UTF-8")); byte[] out = sj.toString().getBytes(StandardCharsets.UTF_8); int length = out.length; 

然后,我们可以将表单内容附加到具有适当标题的http请求并发送。

 http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); http.connect(); try(OutputStream os = http.getOutputStream()) { os.write(out); } // Do something with http.getInputStream() 

发送JSON

我们也可以使用java发送json,这也很简单:

 byte[] out = "{\"username\":\"root\",\"password\":\"password\"}" .getBytes(StandardCharsets.UTF_8); int length = out.length; http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); http.connect(); try(OutputStream os = http.getOutputStream()) { os.write(out); } // Do something with http.getInputStream() 

请记住,不同的服务器接受json不同的内容types,看到这个问题。


用java post发送文件

发送文件可能被认为更具挑战性,因为格式更复杂。 我们还将添加对string发送文件的支持,因为我们不想将文件完全缓冲到内存中。

为此,我们定义一些辅助方法:

 private void sendFile(OutputStream out, String name, InputStream in, String fileName) { String o = "Content-Disposition: form-data; name=\"" + URLEncoder.encode(name,"UTF-8") + "\"; filename=\"" + URLEncoder.encode(filename,"UTF-8") + "\"\r\n\r\n"; out.write(o.getBytes(StandardCharsets.UTF_8)); byte[] buffer = new byte[2048]; for (int n = 0; n >= 0; n = in.read(buffer)) out.write(buffer, 0, n); out.write("\r\n".getBytes(StandardCharsets.UTF_8)); } private void sendField(OutputStream out, String name, String field) { String o = "Content-Disposition: form-data; name=\"" + URLEncoder.encode(name,"UTF-8") + "\"\r\n\r\n"; out.write(o.getBytes(StandardCharsets.UTF_8)); out.write(URLEncoder.encode(field,"UTF-8").getBytes(StandardCharsets.UTF_8)); out.write("\r\n".getBytes(StandardCharsets.UTF_8)); } 

然后,我们可以使用这些方法创build多部分发布请求,如下所示:

 String boundary = UUID.randomUUID().toString(); byte[] boundaryBytes = ("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8); byte[] finishBoundaryBytes = ("--" + boundary + "--").getBytes(StandardCharsets.UTF_8); http.setRequestProperty("Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary); // Enable streaming mode with default settings http.setChunkedStreamingMode(0); // Send our fields: try(OutputStream out = http.getOutputStream()) { // Send our header (thx Algoman) out.write(boundaryBytes); // Send our first field sendField(out, "username", "root"); // Send a seperator out.write(boundaryBytes); // Send our second field sendField(out, "password", "toor"); // Send another seperator out.write(boundaryBytes); // Send our file try(InputStream file = new FileInputStream("test.txt")) { sendFile(out, "identification", file, "text.txt"); } // Finish the request out.write(finishBoundaryBytes); } // Do something with http.getInputStream() 

第一个答案很好,但我不得不添加try / catch来避免Java编译器错误。
此外,我有麻烦,以确定如何阅读与Java库的HttpResponse

这是更完整的代码:

 /* * Create the POST request */ HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("http://example.com/"); // Request parameters and other properties. List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("user", "Bob")); try { httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); } catch (UnsupportedEncodingException e) { // writing error to Log e.printStackTrace(); } /* * Execute the HTTP Request */ try { HttpResponse response = httpClient.execute(httpPost); HttpEntity respEntity = response.getEntity(); if (respEntity != null) { // EntityUtils to get the response content String content = EntityUtils.toString(respEntity); } } catch (ClientProtocolException e) { // writing exception to log e.printStackTrace(); } catch (IOException e) { // writing exception to log e.printStackTrace(); } 

使用Apache HTTP组件的一个简单方法是

 Request.Post("http://www.example.com/page.php") .bodyForm(Form.form().add("id", "10").build()) .execute() .returnContent(); 

看看Fluent API

发布可以发送表单数据的代码,甚至可以在Java 7上运行

 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); String host = mUri.getHost(); urlConnection.setRequestMethod("POST"); // PUT is another valid option urlConnection.setDoOutput(true); Map<String,String> arguments = new HashMap<>(); arguments.put("key1", "value"); arguments.put("key2", "value"); StringBuilder sj = new StringBuilder(); for(Map.Entry<String,String> entry : arguments.entrySet()) { sj.append(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue(), "UTF-8") + "&"); } byte[] out = sj.toString().getBytes(); urlConnection.setFixedLengthStreamingMode(out.length); urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); urlConnection.connect(); try { OutputStream os = urlConnection.getOutputStream(); os.write(out); } catch (Exception e) { } } 

最简单的方式发送参数与发布请求:

 String postURL = "http://www.example.com/page.php"; HttpPost post = new HttpPost(postURL); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("id", "10")); UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, "UTF-8"); post.setEntity(ent); HttpClient client = new DefaultHttpClient(); HttpResponse responsePOST = client.execute(post); 

你已经完成了。 现在你可以使用responsePOST 。 以string获取响应内容:

 BufferedReader reader = new BufferedReader(new InputStreamReader(responsePOST.getEntity().getContent()), 2048); if (responsePOST != null) { StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { System.out.println(" line : " + line); sb.append(line); } String getResponseString = ""; getResponseString = sb.toString(); //use server output getResponseString as string value. } 

调用HttpURLConnection.setRequestMethod("POST")HttpURLConnection.setDoOutput(true); 实际上只有后者是需要的,然后成为默认的方法。

我推荐使用build立在apache http api上的http-request 。

 HttpRequest<String> httpRequest = HttpRequestBuilder.createPost("http://www.example.com/page.php", String.class) .responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build(); public void send(){ String response = httpRequest.execute("id", "10").get(); }