2014-06-18 14 views
13

Tôi đang cố gắng đăng một số thông số lên API đường ray bằng cách sử dụng Volley trong Android. Đây là mã:Volley không gọi getParams() cho yêu cầu POST chuẩn

Tôi đã thử với hai câu lệnh tường trình, một trong số getParams() và một số khác trong số getHeaders(). Một trong getHeaders() được ghi lại trong khi một trong những khác không phải là. Tại sao cú volley lại bỏ qua getParams()?

{ 
//full_name,email,password are private variables defined for this class 

String url = "http://10.0.2.2:3000/users/sign_up.json" ; 

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.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(); 
        } 
       }) { 

      @Override 
      public Map<String, String> getParams() { 
       Map<String, String> params = new HashMap<String, String>(); 

       //This does not appear in the log 
       Log.d(TAG,"Does it assign params?") ; 


       params.put("name", full_name.getText().toString()); 
       params.put("email",email.getText().toString()); 
       params.put("password", password.getText().toString()); 

       return params; 
      } 
      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 

       //This appears in the log 
       Log.d(TAG,"Does it assign headers?") ; 

       HashMap<String, String> headers = new HashMap<String, String>(); 
       headers.put("Content-Type", "application/json; charset=utf-8"); 

       return headers; 
      } 

     }; 

     // Adding request to request queue 
     VHelper.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj); 

} 
+1

Nó khá dễ dàng để giải quyết, kiểm tra câu trả lời của tôi [ở đây] (http://stackoverflow.com/a/24402403/1294681). – VinceStyling

Trả lời

26

Sử dụng StringRequest ở vị trí của JsonObjectRequest

StringRequest sr = new StringRequest(Request.Method.POST, url , new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d(TAG, response.toString()); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      Log.d(TAG, ""+error.getMessage()+","+error.toString()); 
     } 
    }){ 
     @Override 
     protected Map<String,String> getParams(){ 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("id", "28"); 
      params.put("value", "1"); 

      return params; 
     } 

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

     AppController.getInstance().addToRequestQueue(sr); 
+4

Tôi không thể tin được điều này. Tôi đã sử dụng một JSONObjectRequest và trình gỡ rối không bao giờ nhấn phương thức getParams(), vì vậy không có tham số POST. Khoảnh khắc tôi thay đổi thành StringRequest trình gỡ lỗi nhấn getParams(). ¬_¬ –

+1

Cảm ơn bạn rất nhiều! Bạn đã lưu ngày của tôi –

+3

Cảm ơn, bạn đã lưu ngày của tôi. Có một lý do tại sao cho JsonObjectRequest phương thức getParams quá tải không nhận được viện dẫn? – Ajay

1

Hãy ghi đè lên các phương pháp getBody(), và nếu máy chủ của bạn không thể xử lý request parameter JSON, bạn phải ghi đè lên getHeaders() phương pháp để thay đổi Loại nội dung của bạn.

Issue có thể tìm thấy ở đây: https://github.com/mcxiaoke/android-volley/issues/82

1

Tham số thứ ba sẽ có một JSONObject bạn không cần getParams() phương pháp chỉ chuyển chúng vào yêu cầu.

JsonObjectRequest jsonObjReq = new JsonObjectRequest(
      method, 
      url, 
      jsonObjParams, // <<< HERE 
      responseListener, 
      errorListener); 
0

Đối JSONobjectRequest các getParams() không làm việc cho các yêu cầu POST vì vậy bạn phải thực hiện một customRequest và ghi đè getParams() phương pháp đằng kia. Bởi vì JsonObjectRequest được mở rộng JsonRequest, nó ghi đè trực tiếp phương thức getBody(), vì vậy hàm getParam() của bạn sẽ không bao giờ gọi ra. Để gọi phương thức getParams() của bạn, trước tiên bạn phải ghi đè getBody(). Hoặc cho một giải pháp đơn giản, bạn có thể sử dụng StringRequest.

0

nó xảy ra vì Volley params cache.

làm sạch nó như thế này

requestQueue.getCache().clear();

hy vọng nó hữu ích!

Các vấn đề liên quan