Получение com.android.volley.Ошибка сервера с использованием библиотеки Volley. Каковы некоторые возможные причины?

#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 означает неверный запрос.

Некоторые причины для этого.

  1. Может быть проблема в методе запроса. Это GET или POST?
  2. API может ожидать заголовок авторизации.

Ответ №4:

Вам также может потребоваться сообщить вашему серверу, который отправляет ответ с кодом 200, volley проверяет наличие этих кодов.

Ответ №5:

Некоторые возможные причины этой ошибки:

  1. Неправильный URL. Проверьте свой URL на наличие ошибок.
  2. Отсутствующие параметры, любые параметры, имеющие нулевое значение, или у вас отсутствует какой-либо параметр.
  3. Следите за ключами, определенными в параметрах, они должны совпадать с ключами 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.