2014-11-02 18 views
8

Tôi mới tham gia Volley và Android nói chung. Dưới đây là đoạn mã (Android sử dụng Volley) mà tôi đang cố gắng thực thi, tuy nhiên đó là máy chủ trả về 400. Sử dụng một REST Client khác hoạt động hoàn hảo. Đó là một yêu cầu đến máy chủ bằng cách sử dụng phương pháp PUT.Yêu cầu PUT Android Volley

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    sendRequest(); 
} 

private void sendRequest() { 
    RequestQueue queue = Volley.newRequestQueue(this); 

    final JSONObject jsonObject = new JSONObject(); 
    try { 
     jsonObject.put("password", "ttttt"); 
     jsonObject.put("username", "tester3"); 
     jsonObject.put("token", "blah"); 
    } catch (JSONException e) { 
     // handle exception 
    } 


    JsonObjectRequest putRequest = new JsonObjectRequest(Request.Method.PUT, url, jsonObject, 
      new Response.Listener<JSONObject>() 
      { 
       @Override 
       public void onResponse(JSONObject response) { 
        // response 
        Log.d("Response", response.toString()); 
       } 
      }, 
      new Response.ErrorListener() 
      { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        // error 
        Log.d("Error.Response", error.toString()); 
       } 
      } 
    ) { 

     @Override 
     public Map<String, String> getHeaders() 
     { 
      Map<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-Type", "application/json"); 
      headers.put("Accept", "application/json"); 
      return headers; 
     } 

     @Override 
     public byte[] getBody() { 

      try { 
       Log.i("json", jsonObject.toString()); 
       return jsonObject.toString().getBytes("UTF-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    }; 

    queue.add(putRequest); 
} 

Khi tôi thực thi mã này, tôi luôn nhận được 400 yêu cầu không hợp lệ và tôi không thể hiểu tại sao. Sử dụng ứng dụng khách khác như Postman, ứng dụng này hoạt động như mong đợi. Đây là yêu cầu người đưa thư:

Request liệu:
{ "token": "blah", "mật khẩu": "ttttt", "username": "tester3" }

Headers: Content-Type: application/json 

Tôi không thể nhìn thấy bất cứ điều gì sai trái với yêu cầu Tôi hy vọng ai đó có thể chỉ ra những gì tôi đang làm sai?

+0

Bạn có tìm thấy giải pháp này không? Tôi cũng bị mắc kẹt trong tình huống tương tự. – RmK

+1

Sợ tôi đã không, hết thời gian và chuyển sang sử dụng trang bị thêm. – WolfBane

+1

Ngay cả khi tôi hết thời gian. Thanh toán ra trang bị thêm nhưng không thể nắm bắt trong thời gian ngắn. Nhưng câu hỏi của bạn đã giúp giải quyết vấn đề. Thêm 'headers.put (" Accept "," application/json "' vào tiêu đề đã giải quyết nó. Cảm ơn. – RmK

Trả lời

-4

Tôi đã dành rất nhiều thời gian để tìm cách thực hiện việc này. Có gì làm việc đối với tôi là thay đổi

Request.Method.PUT 

để

Request.Method.POST 
+0

nhưng đây là câu hỏi về PUT – Niroshan

+0

Bạn là một genious –

4

Đôi khi, thêm tiêu đề "Content-Type", "application/json" trong getHeaders() sẽ không làm việc tốt hơn của nó cũng để ghi đè getBodyContentType () và trả lại tiêu đề ở đây.

Vì vậy, cùng với,

public Map<String, String> getHeaders() 
    { 
     Map<String, String> headers = new HashMap<String, String>(); 
     headers.put("Content-Type", "application/json"); 
     return headers; 
    } 

cũng thêm,

@Override 
    public String getBodyContentType() { 
     return "application/json"; 
    } 

này làm việc cho tôi trong khi sử dụng POST.

0

Chỉ cần thử với một StringRequest, như thế này:

StringRequest putRequest = new StringRequest(Request.Method.PUT, url, 
     new Response.Listener<String>() 
     { 
@Override 
public void onResponse(String response) { 
     // response 
     Log.d("Response", response.toString()); 
     } 
     }, 
     new Response.ErrorListener() 
     { 
@Override 
public void onErrorResponse(VolleyError error) { 
     // error 
     Log.d("Error.Response", error.toString()); 
     } 
     } 
     ) { 

@Override 
public Map<String, String> getHeaders() 
     { 
     Map<String, String> headers = new HashMap<String, String>(); 
     headers.put("Content-Type", "application/json"); 
     //or try with this: 
     //headers.put("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 
     return headers; 
     } 
@Override 
protected Map<String, String> getParams() { 
     Map<String, String> params = new HashMap<String, String>(); 
     params.put("password", "ttttt"); 
     params.put("username", "tester3"); 
     params.put("token", "blah"); 
     return params; 
     } 
     }; 

     queue.add(putRequest); 
     } 
1

JsonObjectRequest thêm Content-Type: application/json; charset=utf-8 theo mặc định. headers.put("Content-Type", "application/json"); của bạn thêm Content-Type và một số ứng dụng khác không hoạt động với nhiều định nghĩa Content-Type. Bạn nên cố gắng xóa headers.put("Content-Type", "application/json");.

+0

Nó giải quyết được vấn đề của tôi. Đôi khi bạn chỉ quên những thứ cơ bản như vậy. – Martin

0
@Override 
public String getBodyContentType() { 
    return "application/json"; 
} 

Điều này đã giúp tôi sử dụng yêu cầu PUT.

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