#android #android-volley
#Android #android-volley
Вопрос:
Когда я делаю запрос в Volley, я получаю com.android.volley.ServerError
и отвечаю код 400.
Я делаю что-то вроде этого (общий пример кода):
final String param1 = "...";
final String param2 = "...";
// etc.
StringRequest stringRequest = new StringRequest(Request.Method.POST, API_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("PARAM_1", param1);
params.put("PARAM_2",password);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
Каковы возможные причины этого?
Комментарии:
1. Я бы предложил перехватить запрос по проводу с помощью tcpdump или wireshark и сравнить его с рабочим запросом от браузера или Postman.
2. Также может быть что-то не так с вашим php-скриптом, как я испытал.
Ответ №1:
У меня была такая же проблема. Это истощило весь мой день. Наконец, я обнаружил крошечную ошибку, которая заключалась в том, что я передавал нулевое значение в параметрах.
Проверьте, не передаете ли вы нулевое значение серверу в getParams() или в вашем объекте JSON. Если да, это может быть проблемой.
Комментарии:
1. На случай, если это кому-то поможет: вы не хотите передавать какие-либо параметры? —> Установите для него значение null, но НЕ используйте пустую HashMap<String, String> в качестве второго аргумента, например. это работает JsonObjectRequest(YOUR_URL, null, …)
Ответ №2:
В приведенном ниже методе
public void onErrorResponse(VolleyError error)
добавьте эту строку:-
error.printStackTrace()
Вы получите всю трассировку стека, которая выдает фактическую ошибку. Я также получаю эту ошибку, но в моем случае это на самом деле TimeoutException.
Ответ №3:
Код ответа 400 означает неверный запрос.
Некоторые причины для этого.
- Может быть проблема в методе запроса. Это GET или POST?
- API может ожидать заголовок авторизации.
Ответ №4:
Вам также может потребоваться сообщить вашему серверу, который отправляет ответ с кодом 200, volley проверяет наличие этих кодов.
Ответ №5:
Некоторые возможные причины этой ошибки:
- Неправильный URL. Проверьте свой URL на наличие ошибок.
- Отсутствующие параметры, любые параметры, имеющие нулевое значение, или у вас отсутствует какой-либо параметр.
- Следите за ключами, определенными в параметрах, они должны совпадать с ключами API.
Ответ №6:
Эта ошибка может означать НЕПРАВИЛЬНЫЙ ЗАПРОС, проверьте заголовки, которые вы отправляете. Переопределяя метод getHeaders(), вы можете отправлять правильные заголовки.
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return (headers != null || headers.isEmpty()) ? headers : super.getHeaders();
}
Кроме того, обычно веб-сервисам требуются заголовки application / json, как показано ниже:
headers.put("Accept","application/json");
headers.put("Content-Type","application/json");
Ответ №7:
Дважды проверьте свои параметры (не должно быть параметра null). Если все в порядке, тогда, если вы используете JSONObjectRequest
, удалите Request.Method.GET
в соответствии с новой политикой Google.