Get HTTP status code for successful requests with Volley

前端 未结 4 1316
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-28 16:03

I\'m retrieving the content of a invalid web address with volley, i.e. http://www.gigd32fdsu.com: This is my test code:

// Instantiate the Reque         


        
相关标签:
4条回答
  • 2020-12-28 16:24

    Simple solution is to override parseNetworkResponse in makeStringReq(), no need for another class:

    private void makeStringReq() {
        showProgressDialog();
    
        StringRequest strReq = new StringRequest(Method.GET,
                Const.URL_STRING_REQ,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.d(TAG, response.toString());
                        msgResponse.setText(response.toString());
                        hideProgressDialog();
    
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        hideProgressDialog();
                    }
                }) {
    
            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                int mStatusCode = response.statusCode;
                return super.parseNetworkResponse(response);
            }
        };
    
        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    
    }
    
    0 讨论(0)
  • 2020-12-28 16:24

    I will make the response from VinceStyling more complete. I'll tell you what I do.

    Once you override this method, save the statusCode in your class.

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                statusCode=response.statusCode;
                return super.parseNetworkResponse(response);
            }
    

    After that you should compare it with HttpURLConnection constants to act accordingly. For example:

                int statusCode=webService.getStatusCode();
                switch (statusCode){
                    case HttpURLConnection.HTTP_OK:
                        //do stuff
                        break;
                    case HttpURLConnection.HTTP_NOT_FOUND:
                        //do stuff
                        break;
                    case HttpURLConnection.HTTP_INTERNAL_ERROR:
                        //do stuff
                        break;
                }
    
    0 讨论(0)
  • 2020-12-28 16:31

    Just override the parseNetworkResponse method then take the statusCode value.

    public class StrImplRequest extends StringRequest {
        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            // take the statusCode here.
            response.statusCode;
            return super.parseNetworkResponse(response);
        }
    }
    
    0 讨论(0)
  • 2020-12-28 16:38

    @VinceStyling 's answer is ok, or you can extend Request class and do what you wanna do. For example,

        ServerStatusRequestObject extends Request {
    
        private final Response.Listener mListener;
        private String mBody = "";
        private String mContentType;
    
        public ServerStatusRequestObject(int method,
                                         String url,
                                         Response.Listener listener,
                                         Response.ErrorListener errorListener) {
    
            super(method, url, errorListener);
            mListener = listener;
            mContentType = "application/json";
    
            if (method == Method.POST) {
                RetryPolicy policy = new DefaultRetryPolicy(5000, 0, 5);
                setRetryPolicy(policy);
            }
        }
    
        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            return Response.success(response.statusCode, HttpHeaderParser.parseCacheHeaders(response));
        }
    
        @Override
        protected void deliverResponse(Object response) {
            if (mListener != null) {
                mListener.onResponse(response);
            }
        }
    
        @Override
        public byte[] getBody() throws AuthFailureError {
            return mBody.getBytes();
        }
    
        @Override
        public String getBodyContentType() {
            return mContentType;
        }
    
        @Override
        public int compareTo(Object another) {
            return 0;
        }
    

    then in your response handler, you can still receive the whole messages from server. Try it.

    0 讨论(0)
提交回复
热议问题