如何使用Volley获取错误消息描述

时间:2016-03-07 10:19:25

标签: java android android-volley

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

TestFlight

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

[WebInvoke(Method =" POST",UriTemplate =" users",BodyStyle = WebMessageBodyStyle.Wrapped,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)]         [OperationContract的]         void addUser(String username,String firstname,String lastname,String email,String hash)         {             Console.WriteLine(DateTime.Now +"收到数据包");

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

我已经查看了其他人的问题,但似乎无法找到我正在寻找的答案。有人知道怎么做吗?我尝试过的许多方法都会产生空的花括号,表示JSON的空体。我正在努力获取状态描述。

7 个答案:

答案 0 :(得分:8)

尝试使用此自定义方法:

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) {
        }
    }

它将显示来自请求的错误消息的吐司。在你的截击请求中的onErrorResponse方法中调用它:

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

答案 1 :(得分:1)

你必须覆盖parseNetworkError和deliverError方法,你可以从中获取错误消息。

答案 2 :(得分:1)

覆盖方法的示例:

org.hd.ghost

答案 3 :(得分:1)

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测试

答案 4 :(得分:0)

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());。希望它有所帮助!

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

对于 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
    }