Http Status Code in Android Volley when error.networkResponse is null

前端 未结 8 1153
忘了有多久
忘了有多久 2020-11-29 00:44

I am using Google Volley on the Android platform. I am having a problem in which the error parameter in onErrorResponse is returning a null n

8条回答
  •  情话喂你
    2020-11-29 00:49

    Or, how can I ensure error.networkResponse is non-null in onErrorResponse?

    My first thought would be to check if the object is null.

    @Override
    public void onErrorResponse(VolleyError error) {
        NetworkResponse networkResponse = error.networkResponse;
        if (networkResponse != null && networkResponse.statusCode == HttpStatus.SC_UNAUTHORIZED) {
            // HTTP Status Code: 401 Unauthorized
        }
    }
    

    Alternatively, you could also try grabbing the Status Code by extending the Request class and overriding parseNetworkResponse.

    For example, if extending the abstract Request class

    public class GsonRequest extends Request {
    
        ...
        private int mStatusCode;
    
        public int getStatusCode() {
            return mStatusCode;
        }
        ...
    
        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
    
            mStatusCode = response.statusCode;
            try {
                Log.d(TAG, "[raw json]: " + (new String(response.data)));
                Gson gson = new Gson();
                String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                return Response.success(gson.fromJson(json, mClazz),
                    HttpHeaderParser.parseCacheHeaders(response));
    
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JsonSyntaxException e) {
                return Response.error(new ParseError(e));
            }
        }
        ...
    }
    

    Or, if you are using one of the toolbox classes that already extend the abstract Request class and you don't want to muddle up the implementation for parseNetworkResponse(NetworkResponse networkResponse), continue overriding the method but return the super's implementation via super.parseNetworkResponse(networkResponse)

    e.g. StringResponse

    public class MyStringRequest extends StringRequest {
    
        private int mStatusCode;
    
        public MyStringRequest(int method, String url, Listener listener,
                ErrorListener errorListener) {
            super(method, url, listener, errorListener);
        }
    
        public int getStatusCode() {
            return mStatusCode;
        }
    
        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            mStatusCode = response.statusCode;
            return super.parseNetworkResponse(response);
        }
    }
    

    usage:

    public class myClazz extends FragmentActivity {
    
    
        private Request mMyRequest;
        ...
    
        public void makeNetworkCall() {
        mMyRequest = new MyNetworkRequest(
                Method.GET, 
                BASE_URL + Endpoint.USER,
                new Listener() {
    
                    @Override
                    public void onResponse(String response) {
                        // Success
    
                    }
                }, 
                new ErrorListener() {
    
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if (mMyRequest.getStatusCode() == 401) {
                            // HTTP Status Code: 401 Unauthorized
                        }
                    }
                });
    
        MyVolley.getRequestQueue().add(request);
    }
    

    Of course, the option to override the method inline is available too

    public class MyClazz extends FragmentActivity {
    
        private int mStatusCode;
    
        ...
    
        public void makeNetworkCall() {
    
            StringRequest request = new StringRequest(
                    Method.GET, 
                    BASE_URL + Endpoint.USER,
                    new Listener() {
    
                        @Override
                        public void onResponse(String response) {
                            // Success
    
                        }
                    }, 
                    new ErrorListener() {
    
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            if (mStatusCode == 401) {
                                // HTTP Status Code: 401 Unauthorized
                            }
                        }
                    }) {
    
                        @Override
                        protected Response parseNetworkResponse(NetworkResponse response) {
                            mStatusCode = response.statusCode;
                            return super.parseNetworkResponse(response);
                        }
                    };
        MyVolley.getRequestQueue.add(request);
    }
    

    Update:
    HttpStatus is Deprecated. Use HttpURLConnection instead. See Link.

提交回复
热议问题