【问题标题】:How to get error message description using Volley如何使用 Volley 获取错误消息描述
【发布时间】:2016-03-07 10:19:25
【问题描述】:

我正在使用 Volley 库从 Android Java 向 c# 后端发送一个 http 请求。后端应用程序以预期的错误代码和描述以及 StatusDescription 进行响应。我可以通过wireshark看到响应状态描述,但不知道如何在android端获取描述字符串。

    final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST,
                                url,json,
                            new Response.Listener<JSONObject>() {

                                @Override
                                public void onResponse(JSONObject response) {
                                    TextView mTextView = (TextView) findViewById(R.id.output);
                                    print("Success");
                                }
                            }, new Response.ErrorListener() {

                                @Override
                                public void onErrorResponse(VolleyError error) {
                                    TextView mTextView = (TextView) findViewById(R.id.output);
                                    print("Failure (" + error.networkResponse.statusCode + ")");
//Trying to get the error description/response phrase here
                            }
                        }
                    );

这是处理请求的 C# 代码:

[WebInvoke(方法 = “POST”,UriTemplate = “用户”,BodyStyle = WebMessageBodyStyle.Wrapped,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)] [运营合同] void addUser(String username, String firstname, String lastname, String email, String hash) { Console.WriteLine(DateTime.Now + "收到的数据包");

        //Stores the response object that will be sent back to the android client
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        String description = "User added";
        response.StatusCode = System.Net.HttpStatusCode.OK;

        //Tries to add the new user
        try
        {
            userTable.Insert(username,firstname,lastname,email,hash);
        }
        catch (SqlException e)
        {
            //Default response is a conflict
            response.StatusCode = System.Net.HttpStatusCode.Conflict;

            description = "Bad Request (" + e.Message + ")";

            //Check what the conflict is
            if (userTable.GetData().AsEnumerable().Any(row => username == row.Field<String>("username")))
            {
                description = "Username in use";
            }
            else if (userTable.GetData().AsEnumerable().Any(row => email == row.Field<String>("email")))
            {
                description = "Email address in use";
            }
            else
            {
                response.StatusCode = System.Net.HttpStatusCode.BadRequest;
            }
        }

        //display and respond with the description
        Console.WriteLine(description);
        response.StatusDescription = description;
    }

我查看了其他人的问题,但似乎找不到我正在寻找的答案。有人知道怎么做吗?我尝试过的许多方法都导致空花括号,表示 JSON 的主体为空。我正在尝试专门获取状态描述。

【问题讨论】:

    标签: java android android-volley


    【解决方案1】:

    试试这个自定义方法:

    public void parseVolleyError(VolleyError error) {
            try {
                String responseBody = new String(error.networkResponse.data, "utf-8");
                JSONObject data = new JSONObject(responseBody);
                JSONArray errors = data.getJSONArray("errors");
                JSONObject jsonMessage = errors.getJSONObject(0);
                String message = jsonMessage.getString("message");
                Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
            } catch (JSONException e) {
            } catch (UnsupportedEncodingException errorr) {
            }
        }
    

    它将显示来自请求的错误消息的 toast。在你的 volley 请求中调用 onErrorResponse 方法:

    new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                               parseVolleyError(error);
                            }
                        }
    

    【讨论】:

    • 对于“utf-8”,使用 StandardCharsets.UTF_8,这是为了避免使用 UnsupportedEncodingException 捕获块。
    【解决方案2】:

    networkResponse的数据字段是一个JSON字符串,格式如下:

    {"response":false,"msg":"旧密码不正确。"}

    所以你需要得到与“msg”字段对应的值,像这样(当然所有异常捕获):

    String responseBody = new String(error.networkResponse.data, "utf-8");
    JSONObject data = new JSONObject(responseBody);
    String message = data.optString("msg");
    

    使用 Volley 1.1.1 测试

    【讨论】:

      【解决方案3】:

      IMO,您应该覆盖parseNetworkError,如下所示:

      @Override
      protected VolleyError parseNetworkError(VolleyError volleyError) {
          String json;
          if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) {
              try {
                  json = new String(volleyError.networkResponse.data,
                          HttpHeaderParser.parseCharset(volleyError.networkResponse.headers));
              } catch (UnsupportedEncodingException e) {
                  return new VolleyError(e.getMessage());
              }
              return new VolleyError(json);
          }
          return volleyError;
      }
      

      然后,在onErrorResponse(VolleyError error) 中,例如可以使用Log.e(LOG_TAG, error.toString());。希望对您有所帮助!

      【讨论】:

      • 感谢您的回复,对您有帮助!
      【解决方案4】:

      你必须重写 parseNetworkError 和 DeliverError 方法,你可以从他们那里得到错误信息。

      【讨论】:

      • 您能提供一些代码作为示例吗?不太清楚该怎么做。
      【解决方案5】:

      重写方法的示例:

      final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST,
                  url, json,
                  new Response.Listener<JSONObject>() {
      
                      @Override
                      public void onResponse(JSONObject response) {
                          TextView mTextView = (TextView) findViewById(R.id.output);
                          print("Success");
                      }
                  }, new Response.ErrorListener() {
      
              @Override
              public void onErrorResponse(VolleyError error) {
                  TextView mTextView = (TextView) findViewById(R.id.output);
                  print("Failure (" + error.networkResponse.statusCode + ")");
              }
          }){
              @Override
              protected VolleyError parseNetworkError(VolleyError volleyError) {
                  return super.parseNetworkError(volleyError);
              }
      
              @Override
              public void deliverError(VolleyError error) {
                  super.deliverError(error);
              }
          };
      

      【讨论】:

      • 谢谢你,它帮助了:)
      【解决方案6】:

      对于获取类型错误,您可以使用此代码

      JsonArrayRequest request=new JsonArrayRequest(Request.Method.POST,Url,input,response ->{}  ,error -> {
      
       if (error instanceof TimeoutError) {
            //For example your timeout is 3 seconds but the operation takes longer
       }
      
       else if (error instanceof ServerError) {
              //error in server
       }
      
       else if (error instanceof NetworkError) {
              //network is disconnect
       }
      
       else if (error instanceof ParseError) {
              //for cant convert data
       }
      
       else {
              //other error
       }
       });
      

      您可以使用此代码获取错误消息

      String Message=error.toString();
      

      【讨论】:

        【解决方案7】:

        对于 Kotlin,您可以在请求类或单例中使用它

         override fun parseNetworkError(volleyError: VolleyError): VolleyError {
                    val json: String
                    if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) {
                            json = try {
                                    String(volleyError.networkResponse.data,
                                            Charset.forName(HttpHeaderParser.parseCharset(volleyError.networkResponse.headers)))
                            } catch (e: UnsupportedEncodingException) {
                                    return VolleyError(e.message)
                            }
                            return VolleyError(json)
                    }
                    return volleyError
            }
        

        【讨论】:

          猜你喜欢
          • 2011-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-12
          • 1970-01-01
          • 1970-01-01
          • 2019-11-11
          相关资源
          最近更新 更多