如何在 Volley 中从 JSONObject 获取字符串响应

How to get String response from JSONObject in Volley

我用volley创建了JSONRequest,成功命中服务,我检查了服务端,它接收到数据,并在return中发送"Success"。

问题在于,Service returns String 在输出中,而 Volley 在输出中排除了一些 JSON Data。所以它执行 onError 方法,而不是 onResponse

请指导我如何让它接受字符串响应,或者当您使用 JSONObjectas 请求时是不可能的。

    Request<JSONObject> jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, "http://192.168.0.101:8888/api/services/mytest",
            jsonParent, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.d("Success", response.toString());
            deleteFile();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("Error", error.toString());
            deleteFile();
        }

    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    requestQueue.add(jsonObjectRequest);

您可以使用 StringRequest 代替 JSONRequest。

StringRequest stringRequest = new StringRequest(methodType, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {

                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            }){
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    return headers == null ? super.getHeaders() : headers;
                }

                @Override
                public byte[] getBody() throws AuthFailureError {
                    return "Your JSON body".toString().getBytes();
                }
            };

getheaders 方法是根据需要添加自定义 headers 和 getBody 以提供 request body.

对于仍然需要发送原始 Json 并接收字符串作为响应的用户:

默认情况下,主体由 application/x-www-form-urlencoded; charset=UTF-8 格式的请求参数组成 StringRequest。当覆盖 getBody() 时,正如 Nayan 正确建议的那样,考虑覆盖 getBodyContentType() 以匹配新的正文格式。对于 Json 应该是 application/json.

String url = "www.google.com";

HashMap<String, Object> params = new HashMap<>();
params.put("key1", "Android");
params.put("isCool", true);

StringRequest request = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() {
            public void onResponse(String response) {

            }
        },
        new Response.ErrorListener() {
            public void onErrorResponse(VolleyError error) {

            }
        }
    ) {
        public byte[] getBody() {
            return new JSONObject(params).toString().getBytes();
        }
        public String getBodyContentType() {
            return "application/json";
        }
    };

Volley.newRequestQueue(this).add(request);