जावा में JSON का उपयोग करके HTTP POST


187

मैं जावा में JSON का उपयोग करके एक सरल HTTP POST बनाना चाहता हूं।

मान लीजिए कि URL है www.site.com

और यह उदाहरण के लिए {"name":"myname","age":"20"}लेबल किए गए मान में लेता है 'details'

मैं POST के लिए वाक्य रचना कैसे बनाऊंगा?

मुझे JSON Javadocs में एक POST विधि भी नहीं मिल रही है।

जवाबों:


167

यहाँ है आपको क्या करने की जरूरत है:

  1. Apache HttpClient प्राप्त करें, यह आपको आवश्यक अनुरोध करने में सक्षम करेगा
  2. इसके साथ एक HttpPost अनुरोध बनाएं और हेडर को "एप्लीकेशन / x-www-form-urlencoded" जोड़ें
  3. एक स्ट्रिंगटीनिटी बनाएं कि आप इसे JSON पास करेंगे
  4. कॉल को निष्पादित करें

कोड लगभग जैसा दिखता है (आपको अभी भी इसे डीबग करना होगा और इसे काम करना होगा)

//Deprecated
//HttpClient httpClient = new DefaultHttpClient(); 

HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead 

try {

    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/x-www-form-urlencoded");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    //handle response here...

}catch (Exception ex) {

    //handle exception here

} finally {
    //Deprecated
    //httpClient.getConnectionManager().shutdown(); 
}

9
आप इसे हमेशा JSONObject के रूप में अमूर्त करने के लिए अच्छा अभ्यास कर सकते हैं जैसे कि यदि आप सीधे स्ट्रिंग में कर रहे हैं, तो आप स्ट्रिंग को गलत तरीके से प्रोग्राम कर सकते हैं और सिंटैक्स त्रुटि पैदा कर सकते हैं। JSONObject का उपयोग करके आप यह सुनिश्चित करते हैं कि आपका क्रमांकन हमेशा सही JSON संरचना का अनुसरण करता है
Momo

3
प्रिंसिपल में, वे दोनों सिर्फ डेटा ट्रांसमिट कर रहे हैं। फर्क सिर्फ इतना है कि आप इसे सर्वर में कैसे प्रोसेस करते हैं। यदि आपके पास केवल कुछ कुंजी-मूल्य जोड़ी है, तो key1 = value1, key2 = value2, आदि के साथ एक सामान्य POST पैरामीटर संभवतया पर्याप्त है, लेकिन एक बार जब आपका डेटा अधिक जटिल हो जाता है और विशेष रूप से जटिल संरचना (नेस्टेड ऑब्जेक्ट, सरणियाँ) आप करना चाहते हैं JSON का उपयोग करने पर विचार करना शुरू करें। एक कुंजी-मूल्य जोड़ी का उपयोग करके जटिल संरचना भेजना सर्वर पर पार्स करने के लिए बहुत बुरा और कठिन होगा (आप कोशिश कर सकते हैं और आप इसे तुरंत देखेंगे)। फिर भी उस दिन को याद करें जब हमें वह उरग करना था .. यह बहुत अच्छा नहीं था ..
मोमो

1
मदद करने में खुशी! यदि यह वह है जो आप ढूंढ रहे हैं, तो आपको उत्तर को स्वीकार करना चाहिए ताकि समान प्रश्न वाले अन्य लोगों के पास उनके प्रश्नों का अच्छा नेतृत्व हो। आप उत्तर पर चेक मार्क का उपयोग कर सकते हैं। मुझे बताएं कि क्या आपके पास और प्रश्न हैं
मोमो

12
सामग्री-प्रकार 'अनुप्रयोग / json' नहीं होना चाहिए। 'एप्लीकेशन / x-www-form-urlencoded' का तात्पर्य है कि स्ट्रिंग को क्वेरी स्ट्रिंग के समान स्वरूपित किया जाएगा। NM मैं देख रहा हूँ कि आपने क्या किया, आपने संपत्ति के मूल्य के रूप में json बूँद को रखा।
मैथ्यू वार्ड

1
पदावनत भाग को क्लोसएबलहेटप्लिकेंट के उपयोग से बदला जाना चाहिए जो आपको एक .close () विधि देता है। देखें stackoverflow.com/a/20713689/1484047
Frame91

91

आप अपने जावा क्लासेस को JSON ऑब्जेक्ट्स में बदलने के लिए Gson लाइब्रेरी का उपयोग कर सकते हैं।

उन उदाहरणों के लिए एक पॉज़ो क्लास बनाएँ, जिन्हें आप उदाहरण के अनुसार भेजना चाहते हैं

{"name":"myname","age":"20"}

हो जाता है

class pojo1
{
   String name;
   String age;
   //generate setter and getters
}

एक बार जब आप pojo1 वर्ग में चर सेट करते हैं तो आप निम्न कोड का उपयोग करके भेज सकते हैं

String       postUrl       = "www.site.com";// put in your url
Gson         gson          = new Gson();
HttpClient   httpClient    = HttpClientBuilder.create().build();
HttpPost     post          = new HttpPost(postUrl);
StringEntity postingString = new StringEntity(gson.toJson(pojo1));//gson.tojson() converts your pojo to json
post.setEntity(postingString);
post.setHeader("Content-type", "application/json");
HttpResponse  response = httpClient.execute(post);

और ये आयात हैं

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;

और GSON के लिए

import com.google.gson.Gson;

1
नमस्ते, आप अपनी httpClient ऑब्जेक्ट कैसे बनाते हैं? यह एक इंटरफ़ेस है
user3290180

1
हाँ यह एक इंटरफ़ेस है। आप 'HttpClient httpClient = new DefaultHttpClient ();' का उपयोग करके एक उदाहरण बना सकते हैं
प्रकाश

2
अब यह पदावनत हो गया है, हमें HttpClient httpClient = HttpClientBuilder.create () का निर्माण करना होगा ();
user3290180

5
HttpClientBuilder का आयात कैसे करें?
एस्टरलिंकॉफ़

3
मुझे StringUtils कंस्ट्रक्टर पर ContentType पैरामीटर का उपयोग करने और ContentType.APPLICATION_JSON में मैन्युअल रूप से हेडर सेट करने के बजाय इसे पास करने के लिए थोड़ा साफ लगता है।
12

47

@ Apache HttpClient के लिए मोमो का जवाब, संस्करण 4.3.1 या बाद का संस्करण। मैं JSON-Javaअपना JSON ऑब्जेक्ट बनाने के लिए उपयोग कर रहा हूं :

JSONObject json = new JSONObject();
json.put("someKey", "someValue");    

CloseableHttpClient httpClient = HttpClientBuilder.create().build();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params = new StringEntity(json.toString());
    request.addHeader("content-type", "application/json");
    request.setEntity(params);
    httpClient.execute(request);
// handle response here...
} catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.close();
}

20

HttpURLConnection का उपयोग करना शायद सबसे आसान है ।

http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139

आप JSONObject या अपने JSON का निर्माण करने के लिए जो भी उपयोग करेंगे, लेकिन नेटवर्क को संभालने के लिए नहीं; आपको इसे क्रमबद्ध करना होगा और फिर इसे HttpURLConnection से POST में पास करना होगा।


JSONObject j = new JSONObject (); j.put ("नाम", "myname"); j.put ("आयु", "20"); उसके जैसा? मैं इसे कैसे अनुक्रमित करूं?
asdf007

@ asdf007 सिर्फ उपयोग करें j.toString()
एलेक्स चर्चिल

यह सच है, यह कनेक्शन अवरुद्ध है। यदि आप POST भेज रहे हैं, तो यह संभवतः बहुत बड़ी बात नहीं है; यदि आप वेबसर्वर चला रहे हैं तो यह बहुत महत्वपूर्ण है।
एलेक्स चर्चिल

HttpURLConnection लिंक मृत है।
टोबियास रोलैंड

क्या आप उदाहरण दे सकते हैं कि शरीर को कैसे पोस्ट किया जाए?

15
protected void sendJson(final String play, final String prop) {
     Thread t = new Thread() {
     public void run() {
        Looper.prepare(); //For Preparing Message Pool for the childThread
        HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 1000); //Timeout Limit
        HttpResponse response;
        JSONObject json = new JSONObject();

            try {
                HttpPost post = new HttpPost("http://192.168.0.44:80");
                json.put("play", play);
                json.put("Properties", prop);
                StringEntity se = new StringEntity(json.toString());
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);
                response = client.execute(post);

                /*Checking response */
                if (response != null) {
                    InputStream in = response.getEntity().getContent(); //Get the data in the entity
                }

            } catch (Exception e) {
                e.printStackTrace();
                showMessage("Error", "Cannot Estabilish Connection");
            }

            Looper.loop(); //Loop in the message queue
        }
    };
    t.start();
}

7
कृपया अपने कोड को संपादित करने पर विचार करें कि आपका कोड क्या करता है और यह समस्या का समाधान क्यों करेगा, इसके बारे में अधिक विवरण जोड़ने के लिए। एक उत्तर जो ज्यादातर कोड में होता है (भले ही यह काम कर रहा हो) आमतौर पर ओपी को उनकी समस्या को समझने में मदद नहीं करेगा
रेनेो

14

इस कोड को आज़माएं:

HttpClient httpClient = new DefaultHttpClient();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/json");
    request.addHeader("Accept","application/json");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    // handle response here...
}catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.getConnectionManager().shutdown();
}

धन्यवाद! केवल आपके उत्तर ने एन्कोडिंग समस्या हल कर दी :)
श्रीकांत

@SonuDhakar आप application/jsonदोनों को हेडर के रूप में और सामग्री-प्रकार के रूप में क्यों भेजते हैं
कसुन सियामबलपिटि

ऐसा लगता है कि DefaultHttpClientपदावनत कर दिया गया है।
sdgfsdh

11

मुझे यह प्रश्न मिला कि java ग्राहक से Google समापन बिंदुओं पर पोस्ट अनुरोध कैसे भेजें, इसका समाधान खोज रहा हूं। उपरोक्त उत्तर, बहुत सही होने की संभावना है, लेकिन Google समापन बिंदु के मामले में काम नहीं करते हैं।

Google समापन बिंदु के लिए समाधान।

  1. अनुरोध निकाय में केवल JSON स्ट्रिंग होनी चाहिए, न कि नाम = मान जोड़ी।
  2. सामग्री प्रकार हेडर को "एप्लिकेशन / जसन" पर सेट किया जाना चाहिए।

    post("http://localhost:8888/_ah/api/langapi/v1/createLanguage",
                       "{\"language\":\"russian\", \"description\":\"dsfsdfsdfsdfsd\"}");
    
    
    
    public static void post(String url, String json ) throws Exception{
      String charset = "UTF-8"; 
      URLConnection connection = new URL(url).openConnection();
      connection.setDoOutput(true); // Triggers POST.
      connection.setRequestProperty("Accept-Charset", charset);
      connection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
    
      try (OutputStream output = connection.getOutputStream()) {
        output.write(json.getBytes(charset));
      }
    
      InputStream response = connection.getInputStream();
    }

    यह सुनिश्चित करें कि HttpClient का उपयोग करके भी किया जा सकता है।


8

आप Apache HTTP के साथ निम्न कोड का उपयोग कर सकते हैं:

String payload = "{\"name\": \"myname\", \"age\": \"20\"}";
post.setEntity(new StringEntity(payload, ContentType.APPLICATION_JSON));

response = client.execute(request);

इसके अतिरिक्त आप एक json ऑब्जेक्ट बना सकते हैं और इस तरह ऑब्जेक्ट में फ़ील्ड्स में डाल सकते हैं

HttpPost post = new HttpPost(URL);
JSONObject payload = new JSONObject();
payload.put("name", "myName");
payload.put("age", "20");
post.setEntity(new StringEntity(payload.toString(), ContentType.APPLICATION_JSON));

मुख्य बात यह है कि ContentType.APPLICATION_JSON को जोड़ना अन्यथा यह मेरे लिए नया StringEntity (पेलोड, ContentType.APPLICATION_JSON) काम नहीं कर रहा था
जॉनी केज

2

जावा 11 के लिए आप नए HTTP क्लाइंट का उपयोग कर सकते हैं :

 HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://localhost/api"))
        .header("Content-Type", "application/json")
        .POST(ofInputStream(() -> getClass().getResourceAsStream(
            "/some-data.json")))
        .build();

    client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();

आप InputStream, String, File से प्रकाशक का उपयोग कर सकते हैं। जैकसन को स्ट्रिंग या आईएस में परिवर्तित करना आप जैक्सन के साथ कर सकते हैं।


1

Apache httpClient 4 के साथ जावा 8

CloseableHttpClient client = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost("www.site.com");


String json = "details={\"name\":\"myname\",\"age\":\"20\"} ";

        try {
            StringEntity entity = new StringEntity(json);
            httpPost.setEntity(entity);

            // set your POST request headers to accept json contents
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");

            try {
                // your closeablehttp response
                CloseableHttpResponse response = client.execute(httpPost);

                // print your status code from the response
                System.out.println(response.getStatusLine().getStatusCode());

                // take the response body as a json formatted string 
                String responseJSON = EntityUtils.toString(response.getEntity());

                // convert/parse the json formatted string to a json object
                JSONObject jobj = new JSONObject(responseJSON);

                //print your response body that formatted into json
                System.out.println(jobj);

            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {

                e.printStackTrace();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

0

मैं अपाचे http एपीआई पर निर्मित http-request का पुन: दावा करता हूं ।

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost(yourUri, String.class)
    .responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   ResponseHandler<String> responseHandler = httpRequest.execute("details", yourJsonData);

   int statusCode = responseHandler.getStatusCode();
   String responseContent = responseHandler.orElse(null); // returns Content from response. If content isn't present returns null. 
}

यदि आप JSONअनुरोध बॉडी के रूप में भेज सकते हैं तो आप निम्न कार्य कर सकते हैं:

  ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);

मैं उपयोग करने से पहले पढ़े गए दस्तावेज़ों को फिर से पढ़ता हूं।


आप सबसे ऊपर के साथ इसका जवाब क्यों देते हैं?
जेरिल कुक

क्योंकि प्रतिक्रिया के साथ इसका उपयोग और हेरफेर करना बहुत सरल है।
बेनो अरकलीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.