जावा में HTTP पोस्ट अनुरोध भेजना


294

इस URL को मान लें ...

http://www.example.com/page.php?id=10            

(यहां एक POST अनुरोध में आईडी भेजनी होगी)

मैं id = 10सर्वर को भेजना चाहता हूं page.php, जो इसे एक POST विधि में स्वीकार करता है।

मैं जावा के भीतर से यह कैसे कर सकता हूं?

मैंने यह कोशिश की:

URL aaa = new URL("http://www.example.com/page.php");
URLConnection ccc = aaa.openConnection();

लेकिन मैं अभी भी यह पता नहीं लगा सकता कि इसे POST के जरिए कैसे भेजा जाए

जवाबों:


339

अपडेट किया गया उत्तर:

चूंकि मूल जवाब में, कुछ कक्षाएं, अपाचे एचटीटीपी घटकों के नए संस्करण में पदावनत हैं, इसलिए मैं इस अपडेट को पोस्ट कर रहा हूं।

वैसे, आप यहां अधिक उदाहरणों के लिए पूर्ण प्रलेखन तक पहुंच सकते हैं

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) {
    try (InputStream instream = entity.getContent()) {
        // do something useful
    }
}

मूल उत्तर:

मैं अपाचे HttpClient का उपयोग करने की सलाह देता हूं। इसके तेज और लागू करने में आसान।

HttpPost post = new HttpPost("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.

अधिक जानकारी के लिए इस url की जाँच करें: http://hc.apache.org/


25
थोड़ी देर के लिए अपने हाथों को पाने के लिए कोशिश करने के बाद PostMethodऐसा लगता है कि वास्तव में अब stackoverflow.com/a/9242394/1338936 केHttpPost अनुसार कहा जाता है - किसी को भी इस उत्तर को खोजने के लिए जैसा मैंने किया :)
मार्टिन लिन

1
@ जुआन (और मार्टिन लिन) टिप्पणी के लिए धन्यवाद। मैंने सिर्फ जवाब अपडेट किया।
शहंशाह

क्या आपका संशोधित उत्तर अभी भी hc.apache.org का उपयोग करता है?
djangofan

@djangofan हाँ। संशोधित उत्तर में अपाचे-एचसी का लिंक भी है।
शहंशाह

6
आपको आयातित
कामों

191

वेनिला जावा में एक 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()

5
यह पोस्ट उपयोगी है, लेकिन काफी त्रुटिपूर्ण है। इसे काम करने में मुझे 2 दिन लगे। तो इसे काम करने के लिए आपको स्टैंडआर्टशर्ट्स.UTF8 को StandardCharsets.UTF_8 से बदलना होगा। बाउंड्रीबाइट्स और फिनिशबाउंडरीबाइट्स को दो अतिरिक्त हाइफ़न प्राप्त करने की आवश्यकता होती है जो कंटेंट-टाइप में प्रसारित नहीं होते हैं, इसलिए बाउंड्रीबाइट्स = ("-" + सीमा + "\ r \ n") प्राप्त करें ... एक बार बाउंड्रीबाइट्स को प्रसारित करने की भी आवश्यकता है। पहले क्षेत्र या पहले क्षेत्र को नजरअंदाज कर दिया जाएगा!
अल्गोमन

out.write(finishBoundaryBytes);लाइन की आवश्यकता क्यों है? http.connect();POST भेजने का प्रदर्शन करेंगे, है ना?
जाँनोस

16
"वेनिला जावा में एक POST अनुरोध भेजना आसान है।" और फिर पायथन में कुछ की तुलना में कोड लाइन्स की दर्जनों लाइनें requests.post('http://httpbin.org/post', data = {'key':'value'})... मैं जावा के लिए नया हूं इसलिए यह मेरे लिए "आसान" शब्द का एक बहुत ही अजीब उपयोग है :)
Lynn

1
यह अपेक्षाकृत आसान है जितना मैंने अपेक्षा की थी कि यह जावा :)
शाहीन

enigmatic \ r \ n \ r \ n का अर्थ है CRLF CRLF (गाड़ी वापसी + लाइन फ़ीड)। यह 2x नई लाइन बनाता है। पहली नई लाइन करंट लाइन खत्म करने के लिए है। दूसरी लाइन http हैडर को एक अनुरोध में http बॉडी से अलग करना है। HTTP ASCII आधारित प्रोटोकॉल है। यह \ n \ n डालने के लिए नियम है।
मिता गुस्टिन

99
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());

नोटिस करने के लिए महत्वपूर्ण: कुछ भी अन्य का उपयोग करके फिर String.getBytes () काम नहीं करता है। उदाहरण के लिए, PrintWriter का उपयोग पूरी तरह से विफल हो जाता है।
लिटिल बॉबी टेबल्स

5
और 2 पोस्ट डेटा कैसे सेट करें? बृहदान्त्र द्वारा अलग, अल्पविराम?
शोर बिल्ली

10
encode(String)पदावनत किया गया है। आपको उपयोग करना होगा encode(String, String), जो एन्कोडिंग प्रकार को निर्दिष्ट करता है। उदाहरण: encode(rawData, "UTF-8")
सूडो

3
आप अंत में अनुसरण करना चाह सकते हैं। यह सुनिश्चित करेगा कि अनुरोध समाप्त हो गया है और सर्वर को प्रतिक्रिया को संसाधित करने का मौका मिलता है: conn.getResponseCode ();
सिजमन जोचिम

3
पूरे स्ट्रिंग को एनकोड न करें .. आपको प्रत्येक पैरामीटर के मान को एनकोड करना होगा
user2914191

22

पहला उत्तर बहुत अच्छा था, लेकिन मुझे जावा कंपाइलर त्रुटियों से बचने के लिए कोशिश / पकड़ जोड़ना था।
इसके अलावा, मुझे यह समझने में परेशानी थी कि HttpResponseजावा पुस्तकालयों के साथ कैसे पढ़ा जाए ।

यहाँ अधिक पूर्ण कोड है:

/*
 * Create the POST request
 */
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://example.com/");
// Request parameters and other properties.
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user", "Bob"));
try {
    httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
} catch (UnsupportedEncodingException e) {
    // writing error to Log
    e.printStackTrace();
}
/*
 * Execute the HTTP Request
 */
try {
    HttpResponse response = httpClient.execute(httpPost);
    HttpEntity respEntity = response.getEntity();

    if (respEntity != null) {
        // EntityUtils to get the response content
        String content =  EntityUtils.toString(respEntity);
    }
} catch (ClientProtocolException e) {
    // writing exception to log
    e.printStackTrace();
} catch (IOException e) {
    // writing exception to log
    e.printStackTrace();
}

EntityUtils मददगार थी।
Jay

6
क्षमा करें, लेकिन आपने कोई त्रुटि नहीं पकड़ी, आपने उनका परिचय दिया। ऐसे स्थान पर अपवादों को पकड़ना जहां आप उन्हें संभाल नहीं सकते, वह गलत है और e.printStackTrace()कुछ भी नहीं संभालता है।
माआर्टिनस

java.net.ConnectException: कनेक्शन टाइम आउट: कनेक्ट
kerZy हार्ट

17

Apache HTTP Components का उपयोग करने का एक सरल तरीका है

Request.Post("http://www.example.com/page.php")
            .bodyForm(Form.form().add("id", "10").build())
            .execute()
            .returnContent();

धाराप्रवाह एपीआई पर एक नज़र डालें


3
बस सुविधा के लिए; निर्भरता सेटअप / जानकारी: hc.apache.org/httpcompords-client-4.5.x/httpclient/… और hc.apache.org/httpcompenders-client-4.5.x/fluent
Jaroslav Záruba

5

पोस्ट अनुरोध के साथ पैरामीटर भेजने का सबसे सरल तरीका:

String postURL = "http://www.example.com/page.php";

HttpPost post = new HttpPost(postURL);

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "10"));

UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, "UTF-8");
post.setEntity(ent);

HttpClient client = new DefaultHttpClient();
HttpResponse responsePOST = client.execute(post);

तुमने कर दिया। अब आप उपयोग कर सकते हैं responsePOST। स्ट्रिंग के रूप में प्रतिक्रिया सामग्री प्राप्त करें:

BufferedReader reader = new BufferedReader(new  InputStreamReader(responsePOST.getEntity().getContent()), 2048);

if (responsePOST != null) {
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(" line : " + line);
        sb.append(line);
    }
    String getResponseString = "";
    getResponseString = sb.toString();
//use server output getResponseString as string value.
}


1

मैं अपाचे http एपीआई पर निर्मित http-request का उपयोग करता हूं ।

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost("http://www.example.com/page.php", String.class)
.responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   String response = httpRequest.execute("id", "10").get();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.