【问题标题】:Prase 401 volley error messagePrase 401 截击错误消息
【发布时间】:2015-01-11 16:05:48
【问题描述】:

如何为 volley 解析 401 响应数据,这是我得到的服务器响应,我使用了 volley 网络响应,但它无法获取 JSON 格式的响应数据

Status 200 OK 
{
    alert: {
        title: "Unauthorised access to appointment"
        message: ""
    }-
    response: "0"
}



new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e(TAG, "Req Failed!");
        mProgressDialog.dismiss();
        NetworkResponse localNetworkResponse = error.networkResponse;
        if (localNetworkResponse != null) {
            if (!WebAPIEngine.checkStatusCodeVolley(localNetworkResponse.statusCode)) {
                AlertDialogUtil.displayErrorAlert(error.toString(), mContext);
            }
        } else {
            Log.e(TAG, error.toString());
            try {
                JSONObject jsonObject = new JSONObject(error.getMessage());
                    if (WebAPIEngine.processErrorAlertResp(jsonObject)) {
                        AlertDialogUtil.displayErrorAlert(WebAPIEngine.getErrorMessage(), mContext);
                    } else {
                        AlertDialogUtil.displayErrorAlert(error.toString(), mContext);
                    }
                } 
            catch (Exception e) { e.printStackTrace(); }
        }
    }
});

【问题讨论】:

  • 你试过解析JSONObject object = new JSONObject(new String(error.networkResponse.data));吗?
  • error.networkResponse 变空
  • 首先检查error 是否是NoConnectionError 的实例或任何其他不包含networkResponse 的错误类型。在另一种情况下,应设置 networkResponse 并且还应包含预期的数据。

标签: android android-volley


【解决方案1】:

您可以使用以下代码获取响应

String responseString="";
if (networkResponse != null) {
    try {
        Log.v(TAG , ".getResponseError code :"+networkResponse.statusCode);
        responseString = new String(networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers));
        Log.v(TAG, ".getResponseError body :" + responseString);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

另外,请注意在 Volley 中处理 401 错误是不可靠的:The SO answer 完美地解释了它。

【讨论】:

    【解决方案2】:

    2016 年 7 月更新

    正如 所述,401 错误在 Volley 中无法可靠处理,但我最近发现了The S.O answer 中未提及的解决方法,我认为如果提供的解决方案不适合它可能会很有用你的情况。

    1) 创建一个扩展任何 volley 请求(StringRequest、JSONObjectRequest 等)的基本请求并覆盖 parseNetworkError() 函数

    /* Custom volley request. I chose to extend JsonObjectRequest
     * feel free to extend any other volley class
     */ 
    public class CundinasRequest extends JsonObjectRequest{
    ...
      @Override
      //This will make the volley error message to contain your server's error message
      protected VolleyError parseNetworkError(VolleyError volleyError) {
          if(volleyError.networkResponse != null && volleyError.networkResponse.data != null){
              volleyError = new VolleyError(new String(volleyError.networkResponse.data));
          }
          return volleyError;
      }
    ...
    }
    

    2) 在您的 onErrorResponse() 实现中,您只需解析服务器的错误。这是一个例子:

    //Volley request is made somewhere in this activity
    public class MainActivity extends Activity {
      private final String AUTH_ERROR_IDENTIFIER = "invalid_token";
    ...
      public isAuthorizationError(VolleyError error){
        return error.getMessage().contains(AUTH_ERROR_IDENTIFIER); 
      }
    
      @Override
        public void onErrorResponse(VolleyError error) {
          if(isAuthorizationError(error)
            Log.e(TAG, "Please log in again");
      }
    
    }      
    

    我发现此解决方法很有用,因为我无法更改服务器的返回状态并且授权错误始终相同。为了给你一个想法,它看起来像这样:

    {
      "error": "invalid_token",
      "error_description": "Invalid access token: AN INVALID TOKEN"
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2015-06-22
      • 2018-04-25
      • 2016-04-22
      • 1970-01-01
      • 2022-11-07
      相关资源
      最近更新 更多