Gửi một yêu cầu POST rất dễ dàng trong vanilla Java. Bắt đầu với a URL
, chúng ta cần chuyển đổi nó sang URLConnection
sử dụng url.openConnection();
. Sau đó, chúng ta cần truyền nó tới a HttpURLConnection
, vì vậy chúng ta có thể truy cập setRequestMethod()
phương thức của nó để đặt phương thức của chúng ta. Cuối cùng chúng tôi nói rằng chúng tôi sẽ gửi dữ liệu qua kết nối.
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);
Sau đó chúng ta cần nói rõ những gì chúng ta sẽ gửi:
Gửi một hình thức đơn giản
Một POST bình thường đến từ một mẫu http có định dạng được xác định rõ . Chúng tôi cần chuyển đổi đầu vào của chúng tôi sang định dạng này:
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;
Sau đó chúng tôi có thể đính kèm nội dung biểu mẫu của chúng tôi vào yêu cầu http với các tiêu đề thích hợp và gửi nó.
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()
Gửi JSON
Chúng tôi cũng có thể gửi json bằng java, điều này cũng dễ dàng:
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()
Hãy nhớ rằng các máy chủ khác nhau chấp nhận các loại nội dung khác nhau cho json, xem câu hỏi này .
Gửi tệp với bài viết java
Gửi tệp có thể được coi là khó khăn hơn để xử lý vì định dạng phức tạp hơn. Chúng tôi cũng sẽ thêm hỗ trợ để gửi các tệp dưới dạng chuỗi, vì chúng tôi không muốn đệm toàn bộ tệp vào bộ nhớ.
Đối với điều này, chúng tôi định nghĩa một số phương thức trợ giúp:
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));
}
Sau đó chúng ta có thể sử dụng các phương thức này để tạo một yêu cầu bài đăng nhiều phần như sau:
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()
PostMethod
, dường như nó thực sự được gọiHttpPost
là theo stackoverflow.com/a/9242394/1338936 - chỉ dành cho bất cứ ai tìm thấy câu trả lời này như tôi đã làm :)