在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.
有关更多信息,请查看此网址:http://hc.apache.org/
在vanilla 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具有明确定义的格式。 我们需要将我们的输入转换为这种格式:
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的不同内容类型,请参阅此问题。
用java post发送文件
由于格式更复杂,发送文件可能会更具挑战性。 我们还将添加对字符串发送文件的支持,因为我们不想将文件完全缓冲到内存中。
为此,我们定义了一些辅助方法:
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") + ""rnrn";
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("rn".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") + ""rnrn";
out.write(o.getBytes(StandardCharsets.UTF_8));
out.write(URLEncoder.encode(field,"UTF-8").getBytes(StandardCharsets.UTF_8));
out.write("rn".getBytes(StandardCharsets.UTF_8));
}
然后,我们可以使用这些方法创建多部分发布请求,如下所示:
String boundary = UUID.randomUUID().toString();
byte[] boundaryBytes =
("--" + boundary + "rn").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()
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());
链接地址: http://www.djcxy.com/p/1241.html