জাভাতে ত্রুটির প্রতিক্রিয়া বডি পড়ুন


93

জাভাতে, এইচটিটিপি ফলাফল 404 সীমার হলে এই কোডটি একটি ব্যতিক্রম ছুঁড়ে দেয়:

URL url = new URL("http://stackoverflow.com/asdf404notfound");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.getInputStream(); // throws!

আমার ক্ষেত্রে, আমি জানতে পারি যে সামগ্রীটি 404, তবে আমি এখনও যেভাবেই প্রতিক্রিয়াটির মূল অংশটি পড়তে চাই।

(আমার আসল ক্ষেত্রে প্রতিক্রিয়া কোড 403, তবে প্রতিক্রিয়াটির মূল অংশটি প্রত্যাখ্যানের কারণ ব্যাখ্যা করেছে এবং আমি এটি ব্যবহারকারীর কাছে প্রদর্শন করতে চাই))

আমি কীভাবে প্রতিক্রিয়া বডি অ্যাক্সেস করতে পারি?


আপনি কি নিশ্চিত যে সার্ভার একটি দেহ প্রেরণ করছে?
হ্যাঙ্ক গে

4
@ জিজিগিটাল: এইচটিপিআরএল সংযোগ.জেট ইনপুট স্ট্রিম () দ্বারা ফেলে দেওয়া ব্যতিক্রমটি java.io.FileNotFoundException। (আরও ভাল গুগলেবিলিটির জন্য এটি প্রধানত উল্লেখ করছি))
জোনিক

উত্তর:


173

এখানে বাগ রিপোর্ট (বন্ধ, ঠিক করবে না, কোনও বাগ নয়) not

তাদের পরামর্শগুলি এখানে কোড করার জন্য রয়েছে:

HttpURLConnection httpConn = (HttpURLConnection)_urlConnection;
InputStream _is;
if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
    _is = httpConn.getInputStream();
} else {
     /* error from server */
    _is = httpConn.getErrorStream();
}

4
প্রতিক্রিয়া কোডটি যখন = = 400 হয়, তখন অন্য পথের চেয়ে আপনি কী ত্রুটি প্রবাহ পেতে চান না?
স্টিফেন সোয়েনসেন

4
ত্রুটির ক্ষেত্রে, getInputStream () একটি IO ব্যতিক্রম নিক্ষেপ করবে। আপনার ব্যতিক্রমটি ধরা উচিত এবং getErrorStream () ব্যবহার করে ত্রুটি স্ট্রিম থেকে পড়া উচিত। এটি পোস্ট রিসপন্স কোড চেক করার চেয়ে ভাল পদ্ধতির বলে মনে হচ্ছে।
সুদর্শন ভাট

4
সমস্যাটি হ'ল আপনি যদি HTTPUrlConnication.getErrorStream () কোডটি পড়েন তবে আপনি দেখতে পাবেন যে এটি সর্বদা বাতিল হয়ে যায়। (জাভা 6) :-(
গাংনাস

6
"201 তৈরি" এর মতো অন্যান্য সাফল্যের কোডগুলি এখানে কী ব্যর্থ হবে?
ধনী

4
বাগের প্রতিবেদনে চেক করার পরামর্শ দেওয়া হয়েছে httpConn.getResponseCode() >= 400(এবং তাদের কাজের চারপাশে একটি ত্রুটি রয়েছে, ইনপুটস্ট্রিমগুলি ব্যবহার করার জন্য ঝাঁকুনি দেওয়া হয়েছে)
ডাগ

14

আমারও একই সমস্যা ছিল: আপনি যদি সংযোগটি থেকে পড়ার চেষ্টা করেন তবে HttpUrlConnectionফিরে আসে returns স্থিতি কোডটি 400 এর চেয়ে বেশি হলে আপনার পরিবর্তে ব্যবহার করা উচিত ।FileNotFoundExceptiongetInputStream()
getErrorStream()

এর চেয়ে আরও বেশি, দয়া করে সাবধান থাকুন যেহেতু এটি কেবল 200 সাফল্যের স্থিতি কোড হতে পারে না, এমনকি 201, 204 ইত্যাদিও প্রায়শই সাফল্যের স্ট্যাটাস হিসাবে ব্যবহৃত হয়।

আমি কীভাবে এটি পরিচালনা করতে গিয়েছিলাম তার একটি উদাহরণ এখানে

... connection code code code ...

// Get the response code 
int statusCode = connection.getResponseCode();

InputStream is = null;

if (statusCode >= 200 && statusCode < 400) {
   // Create an InputStream in order to extract the response object
   is = connection.getInputStream();
}
else {
   is = connection.getErrorStream();
}

... callback/response to your handler....

এইভাবে, আপনি সাফল্য এবং ত্রুটি উভয় ক্ষেত্রেই প্রয়োজনীয় প্রতিক্রিয়া পেতে সক্ষম হবেন।

আশাকরি এটা সাহায্য করবে!


13

.Net- এ আপনার ওয়েবএক্সসেপ্টের রেসপন্স সম্পত্তি রয়েছে যা একটি ব্যতিক্রম স্রোতে অ্যাক্সেস দেয় gives সুতরাং আমি অনুমান করি এটি জাভা জন্য একটি ভাল উপায়, ...

private InputStream dispatch(HttpURLConnection http) throws Exception {
    try {
        return http.getInputStream();
    } catch(Exception ex) {
        return http.getErrorStream();
    }
}

বা আমি প্রয়োগ একটি প্রয়োগ। (এনকোডিং বা অন্যান্য জিনিসগুলির জন্য পরিবর্তনের প্রয়োজন হতে পারে current বর্তমান পরিবেশে কাজ করে))

private String dispatch(HttpURLConnection http) throws Exception {
    try {
        return readStream(http.getInputStream());
    } catch(Exception ex) {
        readAndThrowError(http);
        return null; // <- never gets here, previous statement throws an error
    }
}

private void readAndThrowError(HttpURLConnection http) throws Exception {
    if (http.getContentLengthLong() > 0 && http.getContentType().contains("application/json")) {
        String json = this.readStream(http.getErrorStream());
        Object oson = this.mapper.readValue(json, Object.class);
        json = this.mapper.writer().withDefaultPrettyPrinter().writeValueAsString(oson);
        throw new IllegalStateException(http.getResponseCode() + " " + http.getResponseMessage() + "\n" + json);
    } else {
        throw new IllegalStateException(http.getResponseCode() + " " + http.getResponseMessage());
    }
}

private String readStream(InputStream stream) throws Exception {
    StringBuilder builder = new StringBuilder();
    try (BufferedReader in = new BufferedReader(new InputStreamReader(stream))) {
        String line;
        while ((line = in.readLine()) != null) {
            builder.append(line); // + "\r\n"(no need, json has no line breaks!)
        }
        in.close();
    }
    System.out.println("JSON: " + builder.toString());
    return builder.toString();
}

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত ... আমি অবাক হয়েছি কেন লোকেরা এখনও ব্যতিক্রমগুলি পরিচালনা করার পরিবর্তে যাদু নম্বরগুলি যাচাই করে ...
স্পার্ক

আমি অবাক হয়েছি কেন এটি গৃহীত উত্তর নয়। আমাকে অনেক সাহায্য করেছে। ধন্যবাদ!
নিখিল জৈন

2

আমি জানি যে এটি সরাসরি প্রশ্নের উত্তর দেয় না, তবে সূর্যের দ্বারা সরবরাহ করা এইচটিটিপি সংযোগ লাইব্রেরি ব্যবহারের পরিবর্তে আপনি কমন্স এইচটিপিপ্লিয়েন্টে একবার নজর দিতে চাইতে পারেন , যা (আমার মতে) কাজ করার জন্য অনেক সহজ এপিআই রয়েছে।


4
আমি আলাদা করতে অনুরোধ। যতক্ষণ আপনি সত্যিই সাধারণ জিনিসগুলি করেন ততক্ষণ সূর্যের এপিআই অনেক সহজ। সাধারণ স্টাফ বলতে আমার বোঝা যাচ্ছে খুব বেশি ত্রুটি পরিচালনা না করে কেবল একটি জিইটি, যা প্রচুর সংখ্যক ক্ষেত্রে যথেষ্ট sufficient কার্যত কার্যক্ষমতায় HttpClient অবশ্যই অনেক বেশি।
মাইকেল পিফেল

২০১৪ সালের হিসাবে, সর্বোত্তম হতে পারে OkHttp (যা আসলে কোনও URL খোলার সময় HTTPURL সংযোগের উদাহরণগুলি দেয়)। বিশেষত অ্যান্ড্রয়েডে এটি আপনাকে প্লেইন এইচটিটিপিআরএল সংযোগ এবং অ্যাপাচি এইচটিটিপি ক্লিনেন্ট উভয়েরই কিছু দুষ্ট সমস্যা এড়াতে সহায়তা করতে পারে।
জোনিক

2

প্রথমে প্রতিক্রিয়া কোডটি পরীক্ষা করে তারপরে ব্যবহার করুন HttpURLConnection.getErrorStream()


1
InputStream is = null;
if (httpConn.getResponseCode() !=200) {
    is = httpConn.getErrorStream();
} else {
     /* error from server */
    is = httpConn.getInputStream();
}

4
"201 তৈরি" এর মতো অন্যান্য সাফল্যের কোডগুলি এখানে কী ব্যর্থ হবে?
ধনী

হ্যাঁ @ রিচ, এজন্যই আরও ভাল লাগবে:if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
এও_

1

আমার চলমান কোড।

  HttpURLConnection httpConn = (HttpURLConnection) urlConn;    
 if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                        in = new InputStreamReader(urlConn.getInputStream());
                        BufferedReader bufferedReader = new BufferedReader(in);
                        if (bufferedReader != null) {
                            int cp;
                            while ((cp = bufferedReader.read()) != -1) {
                                sb.append((char) cp);
                            }
                            bufferedReader.close();
                        }
                            in.close();

                    } else {
                        /* error from server */
                        in = new InputStreamReader(httpConn.getErrorStream());
                    BufferedReader bufferedReader = new BufferedReader(in);
                    if (bufferedReader != null) {
                        int cp;
                        while ((cp = bufferedReader.read()) != -1) {
                            sb.append((char) cp);
                        }
                        bufferedReader.close();
                    }    
                    in.close();
                    }
                    System.out.println("sb="+sb);

0

জাভাতে 404 প্রতিক্রিয়া বডিটি কীভাবে পড়বেন:

অ্যাপাচি লাইব্রেরি ব্যবহার করুন - https://hc.apache.org/httpcomponents-client-4.5.5.x/httpclient/apidocs/

বা জাভা 11 - https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html

নীচে দেওয়া স্নিপেট অ্যাপাচি ব্যবহার করে:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;

CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse resp = client.execute(new HttpGet(domainName + "/blablablabla.html"));
String response = EntityUtils.toString(resp.getEntity());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.