การส่งคำขอ POST นั้นทำได้ง่าย ๆ ใน vanilla Java เริ่มต้นด้วยURL
เราจำเป็นต้องแปลงเป็นใช้URLConnection
url.openConnection();
หลังจากนั้นเราต้องส่งไปที่ a 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);
จากนั้นเราต้องระบุสิ่งที่เรากำลังจะส่ง:
ส่งแบบฟอร์มอย่างง่าย
POST ปกติที่มาจากฟอร์ม http มีรูปแบบที่กำหนดไว้อย่างดี เราจำเป็นต้องแปลงอินพุตของเราเป็นรูปแบบนี้:
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
เรายังสามารถส่ง json โดยใช้ java ซึ่งเป็นเรื่องง่าย:
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
การส่งไฟล์อาจมีความท้าทายมากขึ้นในการจัดการเนื่องจากรูปแบบนั้นซับซ้อนกว่า เราจะเพิ่มการสนับสนุนสำหรับการส่งไฟล์เป็นสตริงเนื่องจากเราไม่ต้องการบัฟเฟอร์ไฟล์ทั้งหมดในหน่วยความจำ
สำหรับสิ่งนี้เรากำหนดวิธีการช่วยเหลือบางอย่าง:
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));
}
จากนั้นเราสามารถใช้วิธีการเหล่านี้เพื่อสร้างคำขอโพสต์แบบหลายส่วนดังนี้
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
ดูเหมือนว่าตอนนี้จริง ๆ ที่เรียกว่าHttpPost
เป็นต่อstackoverflow.com/a/9242394/1338936 - เพียงแค่สำหรับทุกคนในการหาคำตอบนี้เหมือนผม :)