I’m sending an http request from Android Java using the Volley library to a c# backend. The backend application responds with a error code and description as intended, as well as a StatusDescription. I can see the response status description through wireshark but do not know how to get the description string on the android side.
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 } } );
This is the C# code processing the request:
[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<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; }
I’ve looked through other peoples questions but can’t seem to find the answer I’m looking for. Anyone know how to do this? Many methods I have tried resulted in empty curly braces, indicating JSON with an empty body. I am trying specifically to get the status description.
Answer
Try with this custom method:
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) { } }
It will show toast with error message from the request. Call this in onErrorResponse method in your volley request:
new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { parseVolleyError(error); } }