我正在开发一款Android应用。在我的应用程序中,我使用volley通过API将数据发布到服务器。但我遇到从服务器检索错误消息并解析它的问题。
从服务器我返回带有Http状态代码400的json数据,如下所示:
{
"name":["name is required"],
"email":["email is required"]
}
因此,当我向它发出截击请求时,我收到状态码400的错误,如下面的屏幕截图所示。
我想要的是,我想从服务器解析该错误消息并向用户显示。我点了这个链接 - Android: How handle message error from the server using Volley?
这是我使用排球
发出请求和检索错误消息的方式String url = LinkConfig.Register;
JSONObject param = new JSONObject();
param.put("name",tfName.getText().toString().trim());
param.put("email",tfEmail.getText().toString().trim());
param.put("password",tfPassword.getText().toString().trim());
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, param, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if(response!=null)
{
try{
String accessToken = response.getString("access_token");
User user = new User();
user.setId(response.getString("id"));
user.setName(response.getString("name"));
user.setEmail(response.getString("email"));
user.setAvatarUrl(response.isNull("avatar_url") ? null : response.getString("avatar_url"));
config.StoreUserCredentials(user, accessToken);
setResult(MainActivity.REGISTER_REQUEST_CODE);
finish();
}
catch (JSONException e)
{
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
NetworkResponse response = error.networkResponse;
String json = "";
if(response != null && response.data != null){
switch(response.statusCode){
case 400:
json = new String(response.data);
Toast.makeText(getBaseContext(),json,Toast.LENGTH_SHORT).show();
break;
}
//Additional cases
}
}
}){
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
if(volleyError.networkResponse != null && volleyError.networkResponse.data != null){
VolleyError error = new VolleyError(new String(volleyError.networkResponse.data));
volleyError = error;
}
return volleyError;
}
};
RequestSingleton.getInstance(getBaseContext()).addToRequestQueue(request);
但是在上面的代码中,error.networkResponse
在onErrorResponse侦听器中始终为null。为什么我的代码不起作用?服务器正在返回正确的数据和状态代码。如何检索错误消息并解析它?
答案 0 :(得分:1)
您可以通过覆盖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;
}
希望它有所帮助!
答案 1 :(得分:0)
我们将错误消息作为字节数组获取,我们必须解析字节数组并获取消息。因此,请在错误响应中尝试此操作
NetworkResponse networkResponse = error.networkResponse;
String local = error.getLocalizedMessage();
if (!TextUtils.isEmpty(local)) {
/** Error Message **/
} else if (networkResponse != null) {
if (networkResponse.statusCode != 200) {
byte[] arr = networkResponse.data;
Toast.makeText(getBaseContext(),exceptionMessage(arr),Toast.LENGTH_SHORT).show();
}
}
下面的方法将解析字节数组并以字符串形式返回,
/**
* Converts the byte[] message to json object and send the exceptional message
*
* @param message error message in byte [] format.
* @return error message in string format.
*/
private String exceptionMessage(byte[] message) {
String strMessage = new String(message);
try {
JSONObject jsonObject = new JSONObject(strMessage);
if (jsonObject != null) {
return jsonObject.optString("exceptionMessage");
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}