2 xxx ব্যতীত অন্য কোডগুলি যখন ফেরত আসে তখন কীভাবে এইচটিপিআরএল সংযোগ ব্যবহার করে প্রতিক্রিয়ার বডি পাবেন?


98

সার্ভারের ত্রুটি ফিরে আসার ক্ষেত্রে জসন প্রতিক্রিয়া পুনরুদ্ধার করতে আমার সমস্যা আছে। বিস্তারিত নীচে দেখুন.

আমি কীভাবে অনুরোধটি সম্পাদন করব

আমি ব্যবহার java.net.HttpURLConnection। আমি অনুরোধের বৈশিষ্ট্যগুলি সেটআপ করি, তারপরে আমি তা করি:

conn = (HttpURLConnection) url.openConnection();

এর পরে, যখন অনুরোধটি সফল হয়, আমি জেসন প্রতিক্রিয়া পাই:

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 এর মতো কিছু ত্রুটি ফিরে আসলে আমি জসনকে পুনরুদ্ধার করতে পারি না ,. নিম্নলিখিত লাইনটি 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();

তবে আমি অনুরোধের বডিটি পুনরুদ্ধার করতে পারি না ... সম্ভবত এমন কোনও পদ্ধতি আছে যা আমি গ্রন্থাগারে লক্ষ্য করি নি?

উত্তর:


134

প্রতিক্রিয়া কোড যদি 200 বা 2XX না getErrorStream()হয় তবে এর পরিবর্তে ব্যবহার করুনgetInputStream().


4
আমার ক্ষেত্রে, একটি প্রতিক্রিয়া কোড 403 হচ্ছে getErrorStream () নাল ফেরৎ
Sip

73

জিনিসগুলি স্ফটিক পরিষ্কার করার জন্য, এখানে আমার কার্য কোড:

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

4
HttpURLConnection.getErrorStream()( sun.net.www.protocol.httpবাস্তবায়ন) প্রত্যাবর্তন nullনা করে responseCode >= 400, সুতরাং আপনার 299 এর চেকটি সম্ভবত ভুল।
ভ্লাদর

6
আপনি যদি জাভা 8 ব্যবহার করেন তবে আপনি স্ট্রিং হিসাবে প্রতিক্রিয়া পেতে পারেন। String responseBody = br.lines().collect(Collectors.joining());
ল্যানিল ম্যারাসিংহে

4
সঠিক পরিসরটি 200 ... 399, কারণ 3xx একটি "পুনর্নির্দেশ" স্থিতি, ত্রুটি নয়।
luca.vercelli

4
@ luca.vercelli আমার মনে হয় এটা 100..399 হওয়া উচিত কারণ 100..199 হিসাবে সংজ্ঞায়িত "তথ্যমূলক" প্রতিক্রিয়া জন্য হয় en.wikipedia.org/wiki/...
WindRider

4

এটি পিএইচপি প্রতিধ্বনির মতো সার্ভার থেকে একটি সফল প্রতিক্রিয়া পাওয়ার সহজ উপায় অন্যথায় একটি ত্রুটি বার্তা।

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);
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.