android volley JsonObjectRequest,它只返回200个正文

max*_*xxo 7 android json android-volley

如何在volley中发出JSON请求,我需要在body中发送一个authentification头和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();

                                }
Run Code Online (Sandbox Code Playgroud)

我尝试了使用字符串或JSON对象,对象的不同种类的响应侦听器,但始终存在错误:android volley org.json.JSONException:在字符0处输入的结尾

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

Var*_*oid 7

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

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

    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        return Response.success(response.statusCode, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    protected void deliverResponse(Integer statusCode) {
        mListener.onResponse(statusCode);
    }
Run Code Online (Sandbox Code Playgroud)

这是班上的核心和灵魂.

有关完整代码和说明,请查看我的博客主题 -

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

链接1

希望它有所帮助,谢谢


scr*_*rrr 5

感谢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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我只是使用它而不是JsonObjectRequest.不太漂亮,也不太难看.


Ita*_*ski 2

JsonObjectRequest当您期望网络响应是 JSON 对象时使用。由于您没有预料到这一点,因此您不应该使用它。

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