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

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

final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST, url,json, new Response.Listener() { @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(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 +“Packet receieved”);

  //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("username"))) { description = "Username in use"; } else if (userTable.GetData().AsEnumerable().Any(row => email == row.Field("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有一个空体。 我正在努力获取状态描述。

尝试使用此自定义方法:

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

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

覆盖方法的示例:

 final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST, url, json, new Response.Listener() { @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); } }; 

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()); 例如。 希望能帮助到你!