首页 文章

Volley JsonArrayRequest发布请求无效

提问于
浏览
2

我是Volley的新手,我正在尝试使用Post请求

JsonArrayRequest

从我在stackoverflow上找到的很多答案,我尝试如下 -

private void getCounts() {
    String url = "http://192.168.1.100/json/count.php";
    JsonArrayRequest req = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidepDialog();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            Log.d(TAG, "Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(),
                    error.getMessage(), Toast.LENGTH_SHORT).show();
            hidepDialog();
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("LastUpdatedAt", "0");
            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Content-Type", "application/json; charset=utf-8");
            headers.put("User-agent", "My useragent");
            return headers;
        }

        @Override
        public byte[] getBody() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("LastUpdatedAt", "0");

            if (params != null && params.size() > 0) {
                Log.d(TAG, encodeParameters(params, getParamsEncoding()).toString());
                return encodeParameters(params, getParamsEncoding());
            }
            return null;
        }

        protected byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {
            StringBuilder encodedParams = new StringBuilder();
            try {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
                    encodedParams.append('=');
                    encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
                    encodedParams.append('&');
                }
                return encodedParams.toString().getBytes(paramsEncoding);
            } catch (UnsupportedEncodingException uee) {
                throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
            }
        }

    };

    AppController.getInstance().addToRequestQueue(req);
}

As one can see, I have tried both, getParams() and getBody() to send LastUpdatedAt as Post request, but no matter what I try the value is not posted and returns null on server.

我甚至尝试使用 JsonArrayRequest(Request.Method.POST, ... 并在请求中发送'params'作为JsonObject,但即使这两个也不起作用 .

在其中一个similar question中,建议使用以下类 -

public class CustomJsonRequest extends Request {

Map<String, String> params;       
private Response.Listener listener; 

public CustomJsonRequest(int requestMethod, String url, Map<String, String> params,
                      Response.Listener responseListener, Response.ErrorListener errorListener) {

    super(requestMethod, url, errorListener);
    this.params = params;
    this.listener = responseListener;
}

@Override
protected void deliverResponse(Object response) {
    listener.onResponse(response); 

}

@Override
public Map<String, String> getParams() throws AuthFailureError {
         return params;
}

@Override
protected Response parseNetworkResponse(NetworkResponse response) {
    try {
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        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));
    }
}

}

但是我无法使用响应列表器 createRequestSuccessListener 及其错误监听器 .

在同样的问题中,建议使用以下构造函数 -

public JsonArrayRequest(int method, String url, JSONObject jsonRequest,
        Listener<JSONArray> listener, ErrorListener errorListener) {
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), 
        listener, errorListener);
}

但是,我无法弄清楚如何让它发挥作用?

1 回答

  • 2

    尝试做类似的事情:

    String url = "http://192.168.1.100/json/count.php";
    
            final JSONObject _jsonRequest = new JSONObject();
            _jsonRequest.put("key", value);
    
            JsonArrayRequest _stringRequest = new JsonArrayRequest(
             url , new Response.Listener<JSONArray>() {
    
                @Override
                public void onResponse(JSONArray response) {
    
                    // Your code here
    
                }
    
            }, new Response.ErrorListener() {
    
                @Override
                public void onErrorResponse(VolleyError error) {
    
                    // Your code here
    
                }
    
            }){
    
                @Override
                public byte[] getBody() {
    
                    try {
    
                        return _jsonRequest.toString().getBytes(getParamsEncoding());
    
                    } catch (UnsupportedEncodingException uee) {
    
                        return null;
    
                    }
    
                }
    
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
    
                    Map<String, String> _params = new HashMap<String, String>();
    
                    _params.put("Content-type", "application/json");
    
                    return _params;
    
                }
    
            };
    
            AppController.getInstance().addToRequestQueue(_stringRequest);
    

相关问题