Mengirim permintaan POST mudah di vanilla Java. Dimulai dengan a URL
, kita perlu mengubahnya menjadi URLConnection
menggunakan url.openConnection();
. Setelah itu, kita perlu melemparkannya ke a HttpURLConnection
, sehingga kita dapat mengakses setRequestMethod()
metodenya untuk mengatur metode kita. Kami akhirnya mengatakan bahwa kami akan mengirim data melalui koneksi.
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);
Maka kita perlu menyatakan apa yang akan kita kirim:
Mengirim formulir sederhana
POST normal yang berasal dari formulir http memiliki format yang jelas . Kami perlu mengonversi input kami ke format ini:
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;
Kami kemudian dapat melampirkan konten formulir kami ke permintaan http dengan tajuk yang tepat dan mengirimkannya.
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()
Mengirim JSON
Kami juga dapat mengirim json menggunakan java, ini juga mudah:
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()
Ingat bahwa server yang berbeda menerima tipe konten yang berbeda untuk json, lihat pertanyaan ini .
Mengirim file dengan posting java
Mengirim file dapat dianggap lebih sulit untuk ditangani karena formatnya lebih kompleks. Kami juga akan menambahkan dukungan untuk mengirim file sebagai string, karena kami tidak ingin buffer file sepenuhnya ke dalam memori.
Untuk ini, kami mendefinisikan beberapa metode pembantu:
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));
}
Kami kemudian dapat menggunakan metode ini untuk membuat permintaan pos multi-bagian sebagai berikut:
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
tampaknya sekarang benar-benar sekarang disebutHttpPost
sebagai per stackoverflow.com/a/9242394/1338936 - hanya untuk siapa pun yang menemukan jawaban ini seperti yang saya lakukan :)