【问题标题】:Cannot retrieve error message from server in Error Listener of Volley in Android无法从 Android 中 Volley 的错误侦听器中的服务器检索错误消息
【发布时间】:2016-10-03 19:25:31
【问题描述】:

我正在开发一个 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?

这就是我使用 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。为什么我的代码不起作用?服务器正在返回正确的数据和状态代码。如何检索错误消息并对其进行解析?

【问题讨论】:

  • 您是否在其他客户端(如 Postman)中尝试了相同的请求,以确认 API 以您期望的方式工作?
  • 是的,我在 Postman 上试过。正如我所提到的,我收到了错误消息。

标签: android android-volley


【解决方案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;
}

【讨论】:

    【解决方案2】:

    我们会以字节数组的形式获取错误消息,我们必须解析字节数组并获取消息。所以,试试这个错误响应

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2017-05-02
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多