Volley没有发送带参数的帖子请求。

时间:2014-09-20 05:43:50

标签: android android-volley

我有以下代码(Volley Library By Google)向我的php服务器发送POST请求并获取信息。我在没有检查php中的isset($_POST['id'])的情况下尝试了代码,代码工作正常。在我开始检查时购买,php将跳过if语句并转到else意味着代码未正确发送params。我该如何解决这个问题?

RequestQueue queue = Volley.newRequestQueue(Chat.this);
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
        CHAT_URL_FEED, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d("THISSSSSSSS", response.toString());
                if (response != null) {
                    parseChatJsonFeed(response);
                }
            }
        }, new Response.ErrorListener(){

    @Override
    public void onErrorResponse(VolleyError error){
        VolleyLog.d("Here", "Error: " + error.getMessage());
    }
}) {

    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<String, String>();
        params.put("id", id);
        return params;
    }

};

queue.add(jsonObjReq);

我也尝试了以下代码:

RequestQueue queue = Volley.newRequestQueue(Chat.this);

        JSONObject params = new JSONObject();
        try {
            params.put("id", id);
        } catch (JSONException e) {
            e.printStackTrace();
        }


        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                CHAT_URL_FEED, params,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d("THISSSSSSSS", response.toString());
                        if (response != null) {
                            parseChatJsonFeed(response);
                        }
                    }
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d("Here", "Error: " + error.getMessage());
            }
        });

        queue.add(jsonObjReq);

但我仍然得到相同的结果。

4 个答案:

答案 0 :(得分:5)

在花了一些时间研究这个问题后,我发现Volley没有正确处理带有POST请求的JSON请求。用户@SMR建议在我的问题的评论部分。我还在Google网上看到了类似的答案,并在git上看到了mian repo。我最终使用GET请求将信息传递给服务器并检索JSON提要。

答案 1 :(得分:3)

StringRequest postRequest = new StringRequest(Request.Method.POST, CHAT_URL_FEED,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                    // response
                  Log.d("THISSSSSSSS", response.toString());
            if (response != null) {
                parseChatJsonFeed(response);
            }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    VolleyLog.d("Here", "Error: " + error.getMessage());
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams()
        {
          Map<String, String> params = new HashMap<String, String>();
    params.put("id", id);
    return params;
        }
    };

Volley在请求JSONObject时不支持参数。您可以使用JSON String获取响应,并可以使用JSONObject类转换回JSON。

答案 2 :(得分:0)

对于发送的POST请求,您可以编写基于JsonRequest类的自定义请求类 附:我在我的图书馆中使用这种方式(基于Volley)

答案 3 :(得分:0)

您还可以将字符串请求(JSON)作为POST发送,如下所示。

        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        String requestStr = "{\n" +
                "\"id\": \"your JSON\"\n" +
                "}\n";

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,"http://<Your url>",
                requestStr,new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                //Your Logic on Success
            }
        },new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //Your Logic on Error
            }
        });

        queue.add(request);