【问题标题】:Volley POST parameter not working?Volley POST 参数不起作用?
【发布时间】:2015-05-13 05:43:32
【问题描述】:

以下是我的 Volley POST 方法调用。 POST 参数不会将数据传递到 Web 服务器/API 尝试了几乎所有操作,例如 1. 覆盖 byte[] getBody() 2.参数类型 3.使用JsonRequest

将四个 POST 参数解析到服务器并在此基础上得到响应。 这段代码缺少什么??

private void generateTicket(final String field1, final String field2 , final String field3, final String field4) {

    StringRequest strReq = new StringRequest(Method.POST,
                    AppConfig.URL_GENERATION, new Response.Listener<String>() {

                        @Override
                        public void onResponse(String response) {
                            try {
                                JSONObject jObj = new JSONObject(response);
                                boolean error = jObj.getBoolean("error");

                                // Check for error node in json
                                if (!error) {
                                // SUCCESS CODE GOES HEAR

                                } else {
                                    // Error in login. Get the error message
                                    String errorMsg = jObj.getString("msg");
                                    Toast.makeText(getApplicationContext(),
                                            errorMsg, Toast.LENGTH_LONG).show();
                                }
                            } catch (JSONException e) {
                                // JSON error
                                e.printStackTrace();
                            }

                        }
                    }, new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e(TAG, "API Error: " + error.getMessage());
                            Toast.makeText(getApplicationContext(),
                                    error.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }) {

                @Override
                protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {  
                    // Posting parameters to the url
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("tag", "generate");
                    params.put("field1", field1);
                    params.put("field2", field2);
                    params.put("field3", field3);
                    params.put("field4", field4);           
                    return params;
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String,String> params = new HashMap<String, String>();
                    params.put("Content-Type","application/x-www-form-urlencoded");
    //              params.put("Content-Type", "application/json");
                    return params;
                }

            };
            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    }

【问题讨论】:

  • 调试并尝试查找...将断点放在响应和错误回调方法上...同时发布您的URL和请求表单...
  • 如何将请求添加到 volley 中?发布您的 Appcontroller 代码。

标签: android android-volley


【解决方案1】:

请在将请求添加到队列之前尝试request.setShouldCache(false);。 我想也许它会有所帮助。

默认情况下,volley 会缓存响应。当它再次遇到 url 时,它将从其缓存中获取,而不是从网络中获取。即使重新安装应用程序(就像你在调试中所做的那样),缓存仍然在这里。但是卸载安装会清除缓存。

如果您使用 POST 方法,请不要使用 JsonRequest。它根本不会调用getParams()

【讨论】:

  • 哇,将缓存设置为 false 对我来说一直在努力解决这个问题,Volley 默认缓存响应是您知道的非常重要的信息
  • 太棒了:) 它解决了我的问题并拯救了我的一天!谢谢
【解决方案2】:

在我的情况下,解决方案非常奇怪:

我的连接网址是

http://something.com/folder1/folder2

folder2 中包含一个 index.php 文件,用于处理请求。

改成

http://something.com/folder1/folder2/(最后加/)解决问题,服务器收到POST数据

不知道为什么,但我以前见过这个。几乎不可能找到,没有人谈论这个。希望这个答案可以帮助某人。

【讨论】:

    【解决方案3】:

    你有什么错误吗?如果是这样,请更新您的帖子。上面的代码看起来不错。 但是,如果您仍然有问题,您可以使用以下代码

        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
                url, null,
                new Response.Listener<JSONObject>() {
    
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {
    
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                }) {
    
            /**
             * Passing some request headers
             * */
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "application/json");
                headers.put("apiKey", "xxxxxxxxxxxxxxx");
                return headers;
            }
    
        };
    
        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
    

    【讨论】:

      【解决方案4】:

      这个对我有用(见 Volley JsonObjectRequest Post parameters no longer work

      String url = "https://www.youraddress.com/";
      
      Map<String, String> params = new HashMap();
      params.put("first_param", 1);
      params.put("second_param", 2);
      
      JSONObject parameters = new JSONObject(params);
      
      JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, parameters, new Response.Listener<JSONObject>() {
          @Override
          public void onResponse(JSONObject response) {
              //TODO: handle success
          }
      }, new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
              error.printStackTrace();
              //TODO: handle failure
          }
      });
      
      Volley.newRequestQueue(this).add(jsonRequest);
      

      【讨论】:

        【解决方案5】:

        我现在也花了一段时间才让我的请求生效,所以我在这里发布我的解决方案,因为它可能对你们中的一些人有所帮助:

            val url = " https://example.com"
        
            val jsonObjectRequest: JsonObjectRequest = object : JsonObjectRequest(
                Method.POST, url, null,
                { response ->
                    Log.d("jsonResponse", response.toString())
                },
                { error ->
                       Log.d("jsonResponse", error.toString())
                }) {
        
                override fun getBody(): ByteArray {
                    return "api_token=<token>&id=<id>".toByteArray()
                }
        
                override fun getHeaders(): MutableMap<String, String> {
                    val params: MutableMap<String, String> = HashMap()
                    params["Content-Type"] = "application/x-www-form-urlencoded"
                    return params            }
            }
            Volley.newRequestQueue(requireContext()).add(jsonObjectRequest)
        

        所以我的问题是我无法将参数作为 Hashmap 传递,而只需要通过 getBody() 覆盖函数传递字符串。此外,需要在覆盖 getHeaders() 中明确设置标题。可以作为参数传递的 JSONObject 设置为 null,因为它总是被忽略。

        【讨论】:

          猜你喜欢
          • 2015-06-09
          • 2013-11-19
          • 2015-07-03
          • 1970-01-01
          • 2013-05-13
          • 2016-08-12
          相关资源
          最近更新 更多