【问题标题】:How to get status code in successful response Volley Android如何在成功响应 Volley Android 时获取状态码
【发布时间】:2014-08-12 18:37:03
【问题描述】:

想问一下使用Volley时如何获取状态码。

我有以下代码:

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // Here I want to get status code
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }
    )

有可能吗?如果不是,为什么?

【问题讨论】:

    标签: android request response status android-volley


    【解决方案1】:

    也许这个类而不是 StringResponse:

    public class NetworkResponseRequest extends Request<NetworkResponse> {
    private final Response.Listener<NetworkResponse> mListener;
    
    public NetworkResponseRequest(int method, String url, Response.Listener<NetworkResponse> listener,
                         Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }
    
    public NetworkResponseRequest(String url, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }
    
    @Override
    protected void deliverResponse(NetworkResponse response) {
        mListener.onResponse(response);
    }
    
    @Override
    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
        return Response.success(response, HttpHeaderParser.parseCacheHeaders(response));
    }
    
    public static String parseToString(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            parsed = new String(response.data);
        }
        return parsed;
    }
    }
    

    用法:

    NetworkResponseRequest request = new NetworkResponseRequest(Request.Method.GET, "http://example.com/test.php",
                new Response.Listener<NetworkResponse>() {
                    @Override
                    public void onResponse(NetworkResponse response) {
                        // This is status code: response.statusCode
                        // This is string response: NetworkResponseRequest.parseToString(response)
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                    }
                }
        );
    

    使用我自己的实现而不是 StringRequest 并不好。你怎么看?

    【讨论】:

    • 这个答案对我帮助很大。这个答案需要更多的支持!
    【解决方案2】:

    如果你还想使用StringRequest,IMO,可以参考下面的示例代码:

    public class MainActivity extends AppCompatActivity {
    
        private final Context mContext = this;        
        private int mStatusCode = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);              
    
            RequestQueue queue = Volley.newRequestQueue(this);
            String url = "http://google.com";
            StringRequest request = new StringRequest(url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.i("onResponse", response);
                    Log.i("statusCode", String.valueOf(mStatusCode));
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("onErrorResponse", error.toString());
                }
            }) {
                @Override
                protected Response<String> parseNetworkResponse(NetworkResponse response) {
                    if (response != null) {
                        mStatusCode = response.statusCode;
                    }
                    return super.parseNetworkResponse(response);
                }
            };
    
            queue.add(request);
        }
    }
    

    【讨论】:

    • 感谢 BNK 的回复。但是,这种方法会导致每次您在代码中的某处发出不同的请求时重复 parseNetworkResponse。一旦您需要更改整个代码中的方法,您就会遇到问题。而且,将属于Request对象的状态码这样的属性记录到Activity中是没有意义的。一段时间后,我宁愿根据上面发布的解决方案使用“MyStringRequest”对象;)。
    【解决方案3】:

    可以接收以下格式的网络响应

    NetworkResponse response = error.networkResponse;
                    if(response != null && response.data != null){
                        switch(response.statusCode){
                            case 403:
                                json = new String(response.data);
                                json = trimMessage(json, "error");
                                if(json != null) displayMessage(json);
                                break;
                        }
                    }
    

    【讨论】:

    • OP 专门询问成功响应
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2023-04-01
    • 2020-06-27
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多