【问题标题】:android volley JsonObjectRequest which returns no body just 200android volley JsonObjectRequest 仅返回 200
【发布时间】:2013-11-19 15:34:57
【问题描述】:

如何在 volley 中发出 JSON 请求,我需要在正文中发送身份验证标头和 JSON 对象,并且我只希望状态码为 200 答案

JsonObjectRequest request = new JsonObjectRequest(
                method,
                url,
                myJsonObject,
                responseListener,
                errorListener) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                String creds = String.format("%s:%s", login, password);
                String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
                headers.put("Authorization", auth);
                return headers;
            }
        };


new Response.Listener<String>(){

                                @Override
                                public void onResponse(String response) {
                                    Toast.makeText(getActivity(), response, 1000).show();

                                }

我用字符串或 JSON 对象、对象尝试了不同类型的响应侦听器,但总是出现错误: android volley org.json.JSONException:输入结束于

的字符 0

或者在 volley 中是否有任何其他类型的请求支持 json 对象和正文中的身份验证标头,响应只是一个 http 状态码?

【问题讨论】:

    标签: android json android-volley


    【解决方案1】:

    我知道这是一个老问题,但我认为我仍然会回答这个问题,因为我的回答可能会在未来帮助人们 -

    您需要创建一个扩展 Request 类的自定义类,并在该类中覆盖这些方法

        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            return Response.success(response.statusCode, HttpHeaderParser.parseCacheHeaders(response));
        }
    
        @Override
        protected void deliverResponse(Integer statusCode) {
            mListener.onResponse(statusCode);
        }
    

    这是课程的核心和灵魂。

    有关完整代码和解释,请查看我关于该主题的博客 -

    从 Android Volley 库中获取服务器响应状态 200

    link 1

    希望对你有帮助, 谢谢

    【讨论】:

    • 回答老问题!
    【解决方案2】:

    感谢 Varundroid 和 Itai Hanski。没错,你只需要将 JsonObjectRequest 子类化即可。

    为方便起见,这是我的替代:

    public class MyJsonObjectRequest extends JsonObjectRequest { 
        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                // here's the new code, if jsonString.length() == 0 don't parse
                if (jsonString.length() == 0) {
                    return Response.success(null, HttpHeaderParser.parseCacheHeaders(response));
                }
                // end of patch
                return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
        }
    }
    

    所以我只使用它而不是 JsonObjectRequest。 不太漂亮,也不太丑。

    【讨论】:

      【解决方案3】:

      JsonObjectRequest 在您期望网络响应是 JSON 对象时使用。既然你没有预料到,你不应该使用它。

      为了易于使用,Volley 附带了一些预定义的流行请求类型,但您始终可以创建自己的请求。我建议基于JsonObjectRequest 发出自定义请求,但使用parseNetworkResponse() 方法的不同实现,它不期望响应是JSON 对象,因为您没有收到一个。您可以在此处添加所需的任何其他更改。

      【讨论】:

        【解决方案4】:

        不需要像@varundroid 所说的那样创建扩展 Request 的自定义类。 您可以只覆盖 parseNetworkResponse 方法而不是 onResponse 方法并返回带有空 JSONObject() 的成功响应。

        以下是我用来解决您面临的相同问题的代码。希望对你也有帮助

        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        if (response != null && response.data.length == 0)
            return Response.success(new JSONObject(), null);
        else
            return super.parseNetworkResponse(response);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-05
          • 1970-01-01
          • 2013-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多