मैं जावा में स्ट्रिंग के रूप में http प्रतिक्रिया निकाय कैसे प्राप्त कर सकता हूं?


155

मुझे पता है कि इसे यहाँ दस्तावेज़ के रूप में एपाचे कॉमन्स के साथ प्राप्त करने का एक तरीका हुआ करता था: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html और यहाँ एक उदाहरण:

http://www.kodejava.org/examples/416.html

लेकिन मेरा मानना ​​है कि यह पदावनत है। क्या जावा में अनुरोध करने और प्रतिक्रिया निकाय को एक स्ट्रिंग के रूप में प्राप्त करने के लिए कोई अन्य तरीका है और एक धारा नहीं है?


1
चूंकि प्रश्न और सभी उत्तर अपाचे पुस्तकालयों के बारे में प्रतीत होते हैं, इसलिए इसे इस तरह टैग किया जाना चाहिए। मैं 3rdparty libs का उपयोग किए बिना कुछ भी नहीं देखता हूं।
EIS

जवाबों:


104

प्रत्येक पुस्तकालय मैं एक धारा के बारे में सोच सकता हूं। आप इस्तेमाल कर सकते हैं IOUtils.toString()से अपाचे कॉमन्स आईओ एक को पढ़ने के लिए InputStreamएक में Stringएक विधि कॉल में। उदाहरण के लिए:

URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);

अद्यतन: यदि उपलब्ध हो तो मैंने प्रतिक्रिया से सामग्री एन्कोडिंग का उपयोग करने के लिए ऊपर दिए गए उदाहरण को बदल दिया। अन्यथा यह लोकल सिस्टम डिफॉल्ट का उपयोग करने के बजाय UTF-8 को एक सर्वश्रेष्ठ अनुमान के रूप में डिफ़ॉल्ट करेगा।


4
यह कई मामलों में पाठ को भ्रष्ट करेगा क्योंकि विधि सिस्टम डिफ़ॉल्ट पाठ एन्कोडिंग का उपयोग करता है जो ओएस और उपयोगकर्ता सेटिंग्स के आधार पर भिन्न होता है।
मैकडोवेल

1
@ मैकडॉवेल: उफ़ धन्यवाद, मैंने एन्कोडिंग के साथ विधि के लिए javadoc को जोड़ा, लेकिन मैं उदाहरण में इसका उपयोग करना भूल गया। मैंने UTF-8 को अभी के उदाहरण के लिए जोड़ा है, हालांकि तकनीकी रूप Content-Encodingसे यदि उपलब्ध हो तो प्रतिक्रिया से हेडर का उपयोग करना चाहिए ।
व्हाइटफैंग 34

IOUtils का शानदार उपयोग। अच्छा व्यावहारिक दृष्टिकोण।
स्पाइडी

8
वास्तव में charset "charset = ..." जैसे कंटेंट टाइप में निर्दिष्ट है, लेकिन कंटेंटइंकोडिंग में नहीं, जिसमें 'gzip' जैसा कुछ है
तैमूर युसुपोव

1
इस समारोह इनपुट धारा को बंद करना पड़ा का कारण बनता है, वहाँ एक रास्ता है @ WhiteFang34 मैं अपने प्रतिक्रिया प्रिंट और http इकाई उपयोग जारी रख सकते
अमित

275

यहाँ मेरे काम करने की परियोजना से दो उदाहरण हैं।

  1. का उपयोग कर EntityUtilsऔरHttpEntity

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    HttpEntity entity = response.getEntity();
    String responseString = EntityUtils.toString(entity, "UTF-8");
    System.out.println(responseString);
  2. का उपयोग करते हुए BasicResponseHandler

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);

10
एकमात्र समस्या जिसका मुझे विधि 1 से सामना करना पड़ा है, जब आप करते हैं तो इकाई ऑब्जेक्ट का उपभोग किया जाता है response.getEntity()और यह अब उपलब्ध है responseString। यदि आप एक response.getEntity () फिर से करने की कोशिश करते हैं, तो यह वापस आ जाएगी IllegalStateException
तीर्थ

मेरे मामले में काम किया - क्लोसएबल हेटप्लैकिएंट प्रतिक्रिया से शरीर प्राप्त करना।
जारोस्लाव ittreit

1
HttpClient क्या है ?!
एंड्रियास एल।

1
@AndreasL। httpClient HttpClient (org.apache.commons.httpclient पैकेज) प्रकार का है
spideringweb

इसकी इतनी आम प्रतिक्रिया स्ट्रिंग या बाइट सरणी या कुछ के रूप में सामग्री प्राप्त करने के लिए है। आपको देने के लिए सीधे Entity पर एपीआई के साथ अच्छा होगा। इस उपयोग वर्ग को खोजने के लिए इसे देखने के लिए।
क्लॉस इब्सन

52

यहां एक और सरल परियोजना से एक उदाहरण दिया गया है जो मैं अपाचे से httpclient पुस्तकालय का उपयोग करने पर काम कर रहा था:

String response = new String();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("j", request));
HttpEntity requestEntity = new UrlEncodedFormEntity(nameValuePairs);

HttpPost httpPost = new HttpPost(mURI);
httpPost.setEntity(requestEntity);
HttpResponse httpResponse = mHttpClient.execute(httpPost);
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
    response = EntityUtils.toString(responseEntity);
}

स्ट्रिंग के रूप में प्रतिक्रिया निकाय को हथियाने के लिए सिर्फ EntityUtils का उपयोग करें। बहुत आसान।


28

यह विशिष्ट मामले में अपेक्षाकृत सरल है, लेकिन सामान्य मामले में काफी मुश्किल है।

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://stackoverflow.com/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.getContentMimeType(entity));
System.out.println(EntityUtils.getContentCharSet(entity));

उत्तर Content-Type HTTP प्रतिक्रिया हेडर पर निर्भर करता है ।

इस शीर्ष लेख में पेलोड के बारे में जानकारी है और पाठ डेटा के एन्कोडिंग को परिभाषित कर सकता है । यहां तक ​​कि अगर आप पाठ प्रकारों को मानते हैं , तो आपको सही वर्ण एन्कोडिंग का निर्धारण करने के लिए सामग्री का निरीक्षण करने की आवश्यकता हो सकती है। उदाहरण के लिए उस विशेष प्रारूप के लिए विवरण के लिए HTML 4 युक्ति देखें।

एक बार एन्कोडिंग ज्ञात हो जाने पर, डेटा को डीकोड करने के लिए एक इनपुटस्ट्रीमरेडर का उपयोग किया जा सकता है।

यह उत्तर सही काम करने वाले सर्वर पर निर्भर करता है - यदि आप उन मामलों को संभालना चाहते हैं जहां प्रतिक्रिया हेडर दस्तावेज़ से मेल नहीं खाते हैं, या दस्तावेज़ घोषणाओं का उपयोग किए गए एन्कोडिंग से मेल नहीं खाता है, तो यह मछली का एक और केतली है।


इसे हाशप के रूप में कैसे प्राप्त करें? मुझे Json के रूप में प्रतिक्रिया मिली, इसे कैसे पढ़ा जाए?
user1735921

10

नीचे अपाचे HTTP क्लाइंट लाइब्रेरी का उपयोग करते हुए स्ट्रिंग के रूप में प्रतिक्रिया तक पहुंचने का एक सरल तरीका है।

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;

//... 

HttpGet get;
HttpClient httpClient;

// initialize variables above

ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpClient.execute(get, responseHandler);


9

मैकडॉवेल का उत्तर सही है। हालाँकि यदि आप ऊपर दिए गए कुछ पदों में अन्य सुझाव की कोशिश करते हैं।

HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
   response = EntityUtils.toString(responseEntity);
   S.O.P (response);
}

तब यह आपको गैरकानूनी तरीके से बताएगा कि सामग्री पहले से ही खपत है।


3

जावा में HTML रिस्पांस प्राप्त करने के लिए हम नीचे दिए गए कोड का भी उपयोग कर सकते हैं

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.HttpResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.log4j.Logger;

public static void main(String[] args) throws Exception {
    HttpClient client = new DefaultHttpClient();
    //  args[0] :-  http://hostname:8080/abc/xyz/CheckResponse
    HttpGet request1 = new HttpGet(args[0]);
    HttpResponse response1 = client.execute(request1);
    int code = response1.getStatusLine().getStatusCode();

    try (BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));) {
        // Read in all of the post results into a String.
        String output = "";
        Boolean keepGoing = true;
        while (keepGoing) {
            String currentLine = br.readLine();

            if (currentLine == null) {
                keepGoing = false;
            } else {
                output += currentLine;
            }
        }

        System.out.println("Response-->" + output);
    } catch (Exception e) {
        System.out.println("Exception" + e);

    }
}

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

0

यहाँ ऐसा करने का एक हल्का तरीका है:

String responseString = "";
for (int i = 0; i < response.getEntity().getContentLength(); i++) { 
    responseString +=
    Character.toString((char)response.getEntity().getContent().read()); 
}

बेशक responseStringवेबसाइट की प्रतिक्रिया और प्रतिक्रिया के प्रकार से युक्त HttpResponse, द्वारा लौटाया गयाHttpClient.execute(request)


0

निम्नलिखित कोड स्निपेट है जो प्रतिक्रिया निकाय को स्ट्रिंग के रूप में संभालने का बेहतर तरीका दिखाता है चाहे वह HTTP POST अनुरोध के लिए एक मान्य प्रतिक्रिया या त्रुटि प्रतिक्रिया हो:

BufferedReader reader = null;
OutputStream os = null;
String payload = "";
try {
    URL url1 = new URL("YOUR_URL");
    HttpURLConnection postConnection = (HttpURLConnection) url1.openConnection();
    postConnection.setRequestMethod("POST");
    postConnection.setRequestProperty("Content-Type", "application/json");
    postConnection.setDoOutput(true);
    os = postConnection.getOutputStream();
    os.write(eventContext.getMessage().getPayloadAsString().getBytes());
    os.flush();

    String line;
    try{
        reader = new BufferedReader(new InputStreamReader(postConnection.getInputStream()));
    }
    catch(IOException e){
        if(reader == null)
            reader = new BufferedReader(new InputStreamReader(postConnection.getErrorStream()));
    }
    while ((line = reader.readLine()) != null)
        payload += line.toString();
}       
catch (Exception ex) {
            log.error("Post request Failed with message: " + ex.getMessage(), ex);
} finally {
    try {
        reader.close();
        os.close();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        return null;
    }
}

0

आप 3-डी पार्टी लाइब्रेरी का उपयोग कर सकते हैं जो एचटीपी अनुरोध भेजती है और प्रतिक्रिया को संभालती है। प्रसिद्ध उत्पादों में से एक Apache commons HTTPClient होगा: HttpClient javadoc , HttpClient मावेन विरूपण साक्ष्य । अब तक कम ज्ञात लेकिन बहुत सरल HTTPClient (मेरे द्वारा लिखित एक ओपन सोर्स MgntUtils लाइब्रेरी का हिस्सा) है: MgntUtils HttpClient javadoc , MgntUtils maven विरूपण साक्ष्य , MgntUtils Github । उन पुस्तकालयों में से किसी एक का उपयोग करके आप अपना REST अनुरोध भेज सकते हैं और अपने व्यावसायिक तर्क के भाग के रूप में स्प्रिंग से स्वतंत्र रूप से प्रतिक्रिया प्राप्त कर सकते हैं


0

यदि आप जैक्सन का उपयोग कर रहे हैं, तो प्रतिक्रिया शरीर को डिसेरिएलाइज करने के लिए, एक बहुत ही सरल उपाय request.getResponseBodyAsStream()इसके बजाय उपयोग करना हैrequest.getResponseBodyAsString()

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