HttpURLConnection का उपयोग करके प्रतिक्रिया शरीर कैसे प्राप्त करें, जब 2xx के अलावा अन्य कोड वापस आ जाए?


95

जब सर्वर त्रुटि देता है तो मुझे Json प्रतिक्रिया प्राप्त करने में समस्या होती है। विवरण नीचे देखें।

मैं कैसे अनुरोध करता हूं

मैं उपयोग करता हूं java.net.HttpURLConnection। मैं गुणों का अनुरोध सेटअप करता हूं, फिर मैं करता हूं:

conn = (HttpURLConnection) url.openConnection();

उसके बाद, जब अनुरोध सफल होता है, मुझे प्रतिक्रिया मिलती है Json:

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
  sb.append(output);
}
return sb.toString();

... और समस्या यह है:

जब सर्वर 50x या 40x जैसी कुछ त्रुटि देता है, तो मैं प्राप्त Json को पुनः प्राप्त नहीं कर सकता। निम्न पंक्ति IOException को फेंकता है:

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com

सर्वर सुनिश्चित करने के लिए शरीर भेजता है, मैं इसे बाहरी टूल बर्प सूट में देखता हूं:

HTTP/1.1 401 Unauthorized

{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}

मैं निम्नलिखित तरीकों का उपयोग करके प्रतिक्रिया संदेश (अर्थात "आंतरिक सर्वर त्रुटि") और कोड (यानी "500") प्राप्त कर सकता हूं:

conn.getResponseMessage();
conn.getResponseCode();

लेकिन मैं अनुरोध निकाय को पुनः प्राप्त नहीं कर सकता ... शायद कुछ तरीका है जो मुझे पुस्तकालय में नजर नहीं आया?

जवाबों:


132

यदि प्रतिक्रिया कोड 200 या 2xx नहीं है, तो getErrorStream()इसके बजाय का उपयोग करेंgetInputStream().


2
मेरे मामले में, एक प्रतिक्रिया कोड 403, getErrorStream () शून्य देता है
Sip

68

चीजों को स्पष्ट करने के लिए, यहाँ मेरा काम कोड है:

if (200 <= conn.getResponseCode() && conn.getResponseCode() <= 399) {
    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
    br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}

3
HttpURLConnection.getErrorStream()( sun.net.www.protocol.httpकार्यान्वयन) nullजब तक नहीं लौटता है responseCode >= 400, तब तक 299 के लिए आपका चेक शायद गलत है।
vladr

5
यदि आप जावा 8 का उपयोग कर रहे हैं, तो आप स्ट्रिंग के रूप में प्रतिक्रिया प्राप्त कर सकते हैं। String responseBody = br.lines().collect(Collectors.joining());
लानिल मरासिंघे

1
सही सीमा 200 ... 399 है, क्योंकि 3xx एक "रीडायरेक्ट" स्थिति है, त्रुटि नहीं।
luca.vercelli

1

यह PHP इको जैसे सर्वर से एक सफल प्रतिक्रिया प्राप्त करने का एक आसान तरीका है अन्यथा एक त्रुटि संदेश।

BufferedReader br = null;
if (conn.getResponseCode() == 200) {
    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String strCurrentLine;
        while ((strCurrentLine = br.readLine()) != null) {
               System.out.println(strCurrentLine);
        }
} else {
    br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
    String strCurrentLine;
        while ((strCurrentLine = br.readLine()) != null) {
               System.out.println(strCurrentLine);
        }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.