वेनिला जावा में एक POST अनुरोध भेजना आसान है। A से शुरू करते हुए URL
, हमें t 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 के लिए अलग-अलग सामग्री-प्रकार स्वीकार करते हैं, यह प्रश्न देखें ।
जावा पोस्ट के साथ फाइल भेजना
फ़ाइलों को संभालना अधिक चुनौतीपूर्ण माना जा सकता है क्योंकि प्रारूप अधिक जटिल है। हम फ़ाइलों को एक स्ट्रिंग के रूप में भेजने के लिए समर्थन भी जोड़ने जा रहे हैं, क्योंकि हम फ़ाइल को पूरी तरह से मेमोरी में बफर नहीं करना चाहते हैं।
इसके लिए, हम कुछ सहायक विधियों को परिभाषित करते हैं:
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
ऐसा लगता है कि वास्तव में अब stackoverflow.com/a/9242394/1338936 केHttpPost
अनुसार कहा जाता है - किसी को भी इस उत्तर को खोजने के लिए जैसा मैंने किया :)