我是Volley的新手,我正尝试使Post request与


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


可以看到,我已经尝试getParams()getBody()都将LastUpdatedAt作为Post请求发送,但是无论我尝试什么,该值都不会发布,并且在服务器上返回null。

我什至尝试使用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);
}


但是,我不知道如何使它工作?

最佳答案

尝试做类似的事情:

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

关于android - Volley JsonArrayRequest发布请求不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29857933/

10-12 00:20
查看更多