首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得网络响应,即使状态码不是200

如何获得网络响应,即使状态码不是200
EN

Stack Overflow用户
提问于 2019-03-15 18:32:58
回答 4查看 843关注 0票数 2

我使用API进行登录,如果登录成功,则返回代码200并响应。如果不正确的电子邮件或密码将返回带有json对象包含错误的代码401,问题是我希望获得网络响应,即使请求代码不等于200,如图所示

但是volley抛出异常BasicNetwork.performRequest: Unexpected response code 401

以下是我的代码

代码语言:javascript
复制
public interface OnResponse{
    void onResponse(JSONObject response) throws Exception;
    void onErrorResponse(VolleyError volleyError);
}//OnResponse



public static void newRequest(Context context, String url, final Map<String, String>params, final OnResponse onResponse){
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RequestQueue queue = Volley.newRequestQueue(context);
    //
    //onErrorResponse()
    //onResponse()
    StringRequest stringRequest = new StringRequest(Request.Method.POST, url, response -> {
        // - - - - - - - - - - - - - - - - - - - - -
        try {
            JSONObject object = new JSONObject(response);
            onResponse.onResponse(object);
        } catch (Exception e) {
            Log.e(TAG, "FLAG-1");
            e.printStackTrace();
        }
        // - - - - - - - - - - - - - - - - - - - - -
    }, error -> {
        Log.e(TAG, "FLAG-2");
        onResponse.onErrorResponse(error);
    }){
        @Override
        protected VolleyError parseNetworkError(VolleyError volleyError) {
            volleyError.printStackTrace();
            Log.e("zxc", volleyError.getMessage()+"");
            Log.e("zxc", volleyError.getLocalizedMessage()+"");
            return super.parseNetworkError(volleyError);
        }
    };
    //
    stringRequest.setParams(params);
    stringRequest.setShouldCache(false);
    queue.add(stringRequest);
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}//newRequest()`
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-15 18:52:06

VolleyError具有networkResponse属性,它包含响应。

这是一个例子:String response = new String(error.networkResponse.data);

票数 2
EN

Stack Overflow用户

发布于 2019-03-15 18:48:13

只需覆盖newRequest()方法中的parseNetworkResponse,如下所示

代码语言:javascript
复制
StringRequest request = new StringRequest(Method.GET,
            <your url>,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    //handle response
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //handle error
                }
            }) {

        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            int mStatusCode = response.statusCode;
            return super.parseNetworkResponse(response);
        }
    };
票数 0
EN

Stack Overflow用户

发布于 2019-03-15 19:09:35

您可以从VolleyError中提取响应数据。

代码语言:javascript
复制
@Override
public void onErrorResponse(VolleyError error) {
   NetworkResponse networkResponse = error.networkResponse;
   if (networkResponse != null && networkResponse.data != null) {
   String jsonError = new String(networkResponse.data);
   // Print Error!
    }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55180615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档