Apache HttpClient का उपयोग करके पोस्ट JSON का अनुरोध कैसे करें?


91

मेरे पास कुछ इस तरह है:

final String url = "http://example.com";

final HttpClient httpClient = new HttpClient();
final PostMethod postMethod = new PostMethod(url);
postMethod.addRequestHeader("Content-Type", "application/json");
postMethod.addParameters(new NameValuePair[]{
        new NameValuePair("name", "value)
});
httpClient.executeMethod(httpMethod);
postMethod.getResponseBodyAsStream();
postMethod.releaseConnection();

यह 500 के साथ वापस आ रहा है। सेवा प्रदाता का कहना है कि मुझे JSON भेजने की आवश्यकता है। Apache HttpClient 3.1+ के साथ यह कैसे किया जाता है?


2
आपका NameValuePairबस एक अनुरोध पैरामीटर जोड़ता है, आप अपने कोड में कोई JSON नहीं भेज रहे हैं। JSON संरचना क्या सेवा प्राप्त करने की उम्मीद करती है, भेजने के लिए आपका डेटा क्या है? आप देख रहे हैं postMethod.setRequestEntity()एक साथ StringRequestEntityकि आपके JSON शामिल हैं।
फिलिप रीचर्ट

जवाबों:


186

Apache HttpClient को JSON के बारे में कुछ नहीं पता है, इसलिए आपको अपने JSON को अलग से बनाने की आवश्यकता होगी। ऐसा करने के लिए, मैं json.org से साधारण JSON-java लाइब्रेरी की जाँच करने की सलाह देता हूँ । (यदि "JSON-java" आपको सूट नहीं करता है, तो json.org के पास विभिन्न भाषाओं में उपलब्ध पुस्तकालयों की एक बड़ी सूची है)

एक बार जब आप अपना JSON जेनरेट कर लेते हैं, तो आप इसे POST के नीचे दिए कोड की तरह उपयोग कर सकते हैं

StringRequestEntity requestEntity = new StringRequestEntity(
    JSON_STRING,
    "application/json",
    "UTF-8");

PostMethod postMethod = new PostMethod("http://example.com/action");
postMethod.setRequestEntity(requestEntity);

int statusCode = httpClient.executeMethod(postMethod);

संपादित करें

नोट - उपरोक्त उत्तर, जैसा कि प्रश्न में कहा गया है, अपाचे HttpClient 3.1 पर लागू होता है। हालांकि, नवीनतम अपाचे क्लाइंट के खिलाफ कार्यान्वयन की तलाश में किसी की मदद करने के लिए:

StringEntity requestEntity = new StringEntity(
    JSON_STRING,
    ContentType.APPLICATION_JSON);

HttpPost postMethod = new HttpPost("http://example.com/action");
postMethod.setEntity(requestEntity);

HttpResponse rawResponse = httpclient.execute(postMethod);

गैसर को गैन्डल में कैसे जोड़ा जा सकता है?
श्री लू

1
हमेशा जानना चाहते हैं कि एक चाहते थे parameterकरने के लिए जोड़ा जा सकता है POSTMethodऔर एक ही समय सेट एक पर RequestEntityयह करने के लिए? मुझे पता है कि यह अतार्किक लगता है, लेकिन सिर्फ जिज्ञासु है।
asgs

33
सोच रहे लोगों के लिए, StringRequestEntityद्वारा प्रतिस्थापित किया गया है StringEntity
एलेक्स

9
HttpClient के बाद के रिलीज के साथ, PostMethod को HttpPost द्वारा बदल दिया गया था।
Aviro

1
json संदर्भ लिंक टूटा है
सिमोन के।

19

के लिए अपाचे HttpClient 4.5 या नए संस्करण:

    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost("http://targethost/login");
    String JSON_STRING="";
    HttpEntity stringEntity = new StringEntity(JSON_STRING,ContentType.APPLICATION_JSON);
    httpPost.setEntity(stringEntity);
    CloseableHttpResponse response2 = httpclient.execute(httpPost);

ध्यान दें:

1 कोड को संकलित करने के लिए, httpclientपैकेज और httpcoreपैकेज दोनों को आयात किया जाना चाहिए।

2 ट्राई-कैच ब्लॉक को ommitted किया गया है।

संदर्भ : अपाचे आधिकारिक गाइड

कॉमन्स HttpClient परियोजना अब जीवन का अंत है, और अब विकसित नहीं किया जा रहा है। इसे अपाचे HttpCompords परियोजना द्वारा अपने HttpClient और HttpCore मॉड्यूल में बदल दिया गया है


3

जैसा कि जोंसाइड द्वारा उत्कृष्ट उत्तर में उल्लेख किया गया है , आपको JSON स्ट्रिंग बनाने और इसे एक के रूप में सेट करने की आवश्यकता है StringEntity

JSON स्ट्रिंग के निर्माण के लिए, आप किसी भी लाइब्रेरी या विधि का उपयोग कर सकते हैं, जिसके साथ आप सहज हैं। जैक्सन पुस्तकालय एक आसान उदाहरण है:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;

ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("name", "value"); // repeat as needed
String JSON_STRING = node.toString();
postMethod.setEntity(new StringEntity(JSON_STRING, ContentType.APPLICATION_JSON));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.