无法从Android中的Volley错误侦听器中的服务器检索错误消息

时间:2016-06-03 16:24:32

标签: android android-volley

我正在开发一款Android应用。在我的应用程序中,我使用volley通过API将数据发布到服务器。但我遇到从服务器检索错误消息并解析它的问题。

从服务器我返回带有Http状态代码400的json数据,如下所示:

{
  "name":["name is required"],
  "email":["email is required"]
}

因此,当我向它发出截击请求时,我收到状态码400的错误,如下面的屏幕截图所示。

enter image description here

我想要的是,我想从服务器解析该错误消息并向用户显示。我点了这个链接 - 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。为什么我的代码不起作用?服务器正在返回正确的数据和状态代码。如何检索错误消息并解析它?

2 个答案:

答案 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;
    }