我使用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的空体。我正在努力获取状态描述。
答案 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
}