2014-11-02 2 views
8

Я новичок в Volley и Android в целом. Ниже приведен фрагмент кода (Android с помощью Volley), который я пытаюсь выполнить, однако сервер возвращает 400. Использование другого клиента REST отлично работает. Это запрос на сервер с использованием метода PUT.Android Volley PUT request

@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); 
} 

Когда я выполняю этот код, я всегда получаю запрос 400 Bad, и я не могу понять, почему. Использование другого клиента, такого как Почтальон, работает так, как ожидалось. Вот запрос Почтальон:

Сырое Запрос:
{ "маркер": "бла", "пароль": "TTTTT", "имя пользователя": "Tester3" }

Headers: Content-Type: application/json 

Я не вижу ничего плохого в запросе, я надеюсь, кто-то может указать, что я делаю неправильно?

+0

Вам удалось найти решение? Я тоже застрял в той же ситуации. – RmK

+1

Боюсь, что я этого не сделал, закончилось время и перешел на модификацию. – WolfBane

+1

Даже у меня не хватило времени. Оформить заказ, но не удалось схватить за короткое время. Но ваш вопрос помог решить проблему. Добавляя 'headers.put (« Accept »,« application/json »' в заголовке, решили это. Спасибо. – RmK

ответ

-4

Я потратил много времени на поиски, как это сделать. То, что сработало для меня меняла

Request.Method.PUT 

в

Request.Method.POST 
+0

, но это вопрос о PUT – Niroshan

+0

Вы - гениальный –

4

Иногда, добавление заголовка "Content-Type", "приложения/JSON" в getHeaders() не будет работать лучше, чтобы переопределить getBodyContentType () и верните заголовок здесь.

Так наряду с,

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

также добавить,

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

Это работает для меня в то время как с помощью POST.

0

Просто попробуйте с StringRequest, как это:

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 добавляет Content-Type: application/json; charset=utf-8 по умолчанию. Ваш headers.put("Content-Type", "application/json"); добавляет еще один Content-Type, а некоторые приложения не работают с несколькими определениями Content-Type. Вы должны попытаться удалить headers.put("Content-Type", "application/json");.

+0

Он решил мою проблему. Иногда вы просто забываете о таких элементарных вещах. – Martin

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

Это работало для меня с использованием запроса PUT.