【问题标题】:Google Volley ignores POST-ParameterGoogle Volley 忽略 POST 参数
【发布时间】:2013-11-14 15:04:49
【问题描述】:

我目前正在尝试通过 Google Volley 向我的服务器发送一个简单的 POST 请求。 因此,我编写了以下代码行:

Map<String, String> params = new HashMap<String, String>();
params.put("regId", "skdjasjdaljdlksajskl");
JSONObject object = new JSONObject(params);
JsonObjectRequest request = new JsonObjectRequest(Method.POST,
                "address_of_my_server/method", object,
                successListener, errorListener);
queue.add(request);

但是我得到一个错误 500 返回,它表示缺少参数 (regId)。我用 GET-Request 尝试了同样的方法,但得到了相同的结果。

仅当我使用带有格式 URL(如“address_of_my_server/method?regId=sadlasjdlasdklsj”)的 StringRequest 时,服务器才会回复 200。

当我使用 StringRequest 时,我得到完全相同的结果:

StringRequest request = new StringRequest(Method.POST,
                "myurl", successListener,
                errorListener){
            @Override
            protected Map<String, String> getParams()
                    throws AuthFailureError {
               Map<String, String> params = new HashMap<String, String>();
               params.put("regId", "skdjasjdaljdlksajskl");
               return params;
            }
        };

为什么 Volley 会忽略我的参数?

【问题讨论】:

  • 按照设计,参数不是总是在 URL 中传递吗?我认为 JSON 对象是请求的数据部分
  • 嗯..你可能是对的。但是我的 StringRequest 不应该将这些参数自动添加到 URL 中吗?
  • 看起来参数只在 POST 请求中发送,而不是像你提到的那样在 GET 中发送,你尝试过吗?
  • 服务器上的regId 是否接受字符串?看起来它需要一个整数。

标签: android http-post android-volley


【解决方案1】:

上周我遇到了同样的问题,但现在已解决。 您的服务器接受 Content-Type 作为表单数据,在发送 volley 的 JsonObjectRequest 时,请求的内容类型将为 application/json,因此整个参数将作为一个 json 主体发送,而不是像 Stringrequest 中那样作为键值对发送。 更改服务器代码以从 http 请求正文中获取请求参数,而不是从键中获取它(如 php 中的 $_REQUEST['name'])。

【讨论】:

    【解决方案2】:

    使用这个帮助类:

    import java.io.UnsupportedEncodingException;
    import java.util.Map;    
    import org.json.JSONException;
    import org.json.JSONObject;    
    import com.android.volley.NetworkResponse;
    import com.android.volley.ParseError;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.Response.ErrorListener;
    import com.android.volley.Response.Listener;
    import com.android.volley.toolbox.HttpHeaderParser;
    
    public class CustomRequest extends Request<JSONObject> {
    
    private Listener<JSONObject> listener;
    private Map<String, String> params;
    
    public CustomRequest(String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }
    
    public CustomRequest(int method, String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }
    
    protected Map<String, String> getParams()
            throws com.android.volley.AuthFailureError {
        return params;
    };
    
    @Override
    protected Response<JSONObject> 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));
        }
    }
    
    @Override
    protected void deliverResponse(JSONObject response) {
        // TODO Auto-generated method stub
        listener.onResponse(response);
        }
    }
    

    【讨论】:

    • 这解决了我的问题。在 PHP 方面,我使用 Codeigniter 框架,因此我可以使用 $this->input->post() 来安全地处理输入,而不是编写自己的转义代码来避免 sql 注入。
    【解决方案3】:

    Rajesh Batth 提到的问题的沃克示例

    Java 代码:

        JSONObject obj = new JSONObject();
        try {
            obj.put("id", "1");
            obj.put("name", "myname");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    
        JsonObjectRequest jsObjRequest = new JsonObjectRequest(
                Request.Method.POST, url, obj, listener, errorlistener);
    
        RequestQueue queue = Volley.newRequestQueue(context);
        queue.add(jsObjRequest);
    

    PHP-代码:

        $body = file_get_contents('php://input');
        $postvars = json_decode($body, true);
        $id = $postvars["id"];
        $name = $postvars["name"];
    

    注意:

    如果您不发送额外的 GET-VARS,则 PHP-Vars $_POST$_REQUEST$_GET 为空。

    【讨论】:

      【解决方案4】:

      编辑:

      我删除了我之前的答案,因为它不准确。

      我将回顾一下我今天所知道的: 显然,getParams 应该可以工作。但并非总是如此。 我自己调试过,似乎是在执行 PUT 或 POST 请求时调用它,并且该方法中提供的参数位于常规 GET 参数字符串(?param1=value1&amp;param2=value2...)中并编码并放入身体。

      我不知道为什么,但由于某种原因,这对某些服务器不起作用。

      我知道发送参数的最佳替代方法是将参数放入JSONObject 并使用请求构造函数将其内容编码到请求正文中。

      【讨论】:

      • 您的意思是仅用于 POST 或 PUT 消息,不是吗? "返回用于 POST 或 PUT 请求的参数映射。"
      • 是的,有片刻注意力不集中...谢谢
      • @ItaiHanski 但 Frame91 所说的请求是一个 POST,不是吗?那么为什么不调用 getParams() 呢?我在我的应用程序中遇到了同样的问题:发出 POST 请求时未调用 getParams() 方法。
      • 这很奇怪。我在您的问题上发布了答案,但它应该可以工作。发布请求获取参数并将它们编码在正文中。不知道发生了什么。更好的调试。
      • 不知道为什么这个答案被接受。原因是服务器端采用的是post格式而不是json数据。
      【解决方案5】:

      这是我的解决方案

      解决方案1

       public void getData() {
          final RequestQueue queue = Volley.newRequestQueue(this);
          StringRequest postRequest = new StringRequest(Request.Method.POST, "192.168.0.0/XYZ",new Response.Listener<String>() {
                      @Override
                      public void onResponse(String response) {
                          try {
                              JSONArray myArray = new JSONArray(response);
      
                              for(int i = 0; i < myArray.length(); i++)
                              {
                                  JSONObject jObj = myArray.getJSONObject(i);
                                  String category = jObj.getString("nameUser");
                                  Log.e("value", category);
      
                              }
                          } catch (JSONException e) {
                              e.printStackTrace();
                              Log.e("error: ", e.getMessage());
                          }
      
                      }
                  }, new Response.ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError error) {
                  //Toast.makeText(context,"Error : ").show();
              }
          }){
              @Override
              protected Map<String, String> getParams() {
                  Map<String, String> params = new HashMap<String, String>();
                  params.put("id_user", "1");
                  return params;
              }
          };
          queue.add(postRequest);
      }
      

      解决方案2

      请记住,如果您使用 php,则 $_POST[''];
      不工作,her 更多信息。

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 2013-05-13
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多