使用Volley获取成功请求的HTTP状态码

26
我正在使用 Volley 获取无效网址的内容,例如:http://www.gigd32fdsu.com。以下是我的测试代码:
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
final String url = "http://www.gigd32fdsu.com";

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
new Response.Listener() {
    @Override
    public void onResponse(Object response) {
        // Display the first 500 characters of the response string.
        mTextView.setText("Response is: " + response.toString().substring(0, 500));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mTextView.setText("That didn't work! " + error.networkResponse.statusCode);
    }
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
当我运行这段代码时,我收到了来自我的ISP的错误页面回调onResponse(String)。我该如何读取HTTP状态码以便检测网页显示是否正确?谢谢。

请参考以下链接:https://dev59.com/TWAg5IYBdhLWcg3w_fLV - karan
4个回答

32

简单的解决方案是在makeStringReq()中重写parseNetworkResponse,无需创建另一个类:

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);

}

1
以上代码未在onResponse中提供状态码。请在发布前尝试此操作。 - vsecades

7

我会完善VinceStyling的回应。我告诉你我做了什么。

一旦你重写了这个方法,把statusCode保存到你的类中。

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

接下来,您应该将其与HttpURLConnection常量进行比较,以便相应地采取行动。例如:

            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;
            }

3

只需重写parseNetworkResponse方法,然后获取statusCode的值即可。

public class StrImplRequest extends StringRequest {
    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        // take the statusCode here.
        response.statusCode;
        return super.parseNetworkResponse(response);
    }
}

0

@VinceStyling的回答还可以,或者你可以扩展Request类并做你想做的事情。例如,

    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;
    }

然后在您的响应处理程序中,您仍然可以接收来自服务器的完整消息。 试试看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,