【问题标题】:Volley JsonArrayRequest Post request is not workingVolley JsonArrayRequest Post 请求不起作用
【发布时间】:2015-07-03 16:11:06
【问题描述】:

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

正如所见,我已经尝试过getParams()getBody()LastUpdatedAt 作为 Post 请求发送,但无论我尝试什么,该值都不会发布并在服务器上返回 null。

我什至尝试使用 JsonArrayRequest(Request.Method.POST, ... 并在请求中将“参数”作为 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);
}

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

【问题讨论】:

  • 我无法理解究竟您的问题出在哪里。但是,过去我在使用 volley 发出 POST 请求时也遇到了一些问题。这个答案解决了我的问题,也许你可以看看它是否有帮助:stackoverflow.com/questions/19837820/…

标签: android android-volley


【解决方案1】:

尝试做类似的事情:

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

【讨论】:

  • 我试过了,但没用。与JsonArrayRequestResponse.Listener&lt;String&gt; 存在一些冲突。因此,如果我尝试这样放置您的代码,则会显示错误。如果我在两个地方用JSONArray 替换String,它就会运行。但随后抛出错误 - com.android.volley.ParseError: org.json.JSONException: Value You of type java.lang.String cannot be converted to JSONArray
  • 对不起,我犯了一个错误。您应该将Response.Listener&lt;String&gt; 更改为Response.Listener&lt;JSONArray&gt;。现在显示的消息错误是因为服务器发回的内容。它必须发送String 而不是Array。因此,在这种情况下,您必须使用 StringRequest 而不是 JsonArrayRequest 并将 Response.Listener&lt;JSONArray&gt; 更改为 Response.Listener&lt;String&gt; 以及将 public void onResponse(JSONArray response) 更改为 public void onResponse(String response)
  • 感谢您的回复。正如我在之前的评论中提到的,我将Response.Listner&lt;String&gt; 更正为&lt;JsonArray&gt;。我想我发现了,为什么现在它会抛出 String can't be converted to JSONArray 错误。因为我的 JsonObject 就像 - _jsonRequest.put("LastUpdatedAt", "2015-03-15 00:30:04"); 和这个 LastUpdatedAt,我的 PHP 代码通过 $_POST["LastUpdatedAt"] 接收到,在这种情况下不起作用。这就是我的 sql 查询失败并返回的原因字符串中的错误。那么关于如何使其工作的任何想法?
  • 继续我之前的评论,我还尝试使用map 而不是JsonObject 作为我的Post 参数,就像这样-final Map&lt;String, String&gt; _postContent = new HashMap&lt;String, String&gt;();_postContent.put("LastUpdatedAt", "2015-03-15 00:30:04"); 并尝试在两个地方都使用它-@ 987654349@ 和 getHeaders(),但我的 $_POST['LastUpdatedAt'] 仍然返回 null
猜你喜欢
  • 2013-08-05
  • 2013-11-19
  • 2018-09-22
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多