Заголовок авторизации на 2.3.4 получает 400 неверных запросов

1

Я пытаюсь заставить мое простое приложение работать на Android 2.3.4 - пряничный. Первый запрос, который я делаю на сервер, предназначен для аутентификации. Для выполнения запросов я использую RetroFit.

Тем не менее, я получаю ошибку ниже при попытке сделать запрос с телефона, на котором есть пряники.

05-09 16:21:44.724    4706-4734/com.myapp.mobile D/Retrofit﹕ <--- HTTP 400 https://myserver.com/myservice/user/signin (2318ms)
05-09 16:21:44.740    4706-4734/com.myapp.mobile D/Retrofit﹕ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    <hr>
    <address>Apache/2.2.15 (CentOS) Server at localhost Port 443</address>
    </body></html>

Запрос, который я делаю, таков:

@GET("/user/signin")
@Headers({"Content-type: application/json"})
User signin(@Header("Authorization") String value);

Я создаю адаптер следующим образом:

private final RestAdapter REST_ADAPTER = new RestAdapter.Builder()
        .setServer(API_URL)
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .build();

private final MyTaskService MY_SERVICE = REST_ADAPTER.create(MyTaskService.class);

Такая же база кода отлично работает на новом API (я пробовал API 15+).

Есть ли причина, по которой запрос Authorization завершился неудачей на прянике?

Теги:
retrofit
android-2.3-gingerbread

1 ответ

1

Я знаю, старый поток, но я столкнулся с той же проблемой и не нашел здесь решения. Поэтому я исследовал и нашел, что проблема для меня. Однако мы используем Volley.

Фактическая проблема заключалась в использовании кода типа:

    String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
    headers.put("Authorization", auth);

Когда мы просто делаем

    headers.put("Authorization", "Basic asd123ASD123asd");

он работает.

Почему?

Ну, я не знаю, почему Android 2.3 ведет себя иначе, чем новые андроиды, конечно, но что Base64.encodeToString() представил новый символ линии. Я решил это использовать Wireshark. Эта новая строка разбивает HTTP-заголовок на два, поэтому вы получаете два ответа от сервера, последний из которых представляет собой 400 Bad Request, который отображается в Logcat.

Если кто-то заинтересован в том, как я это понял, не спрашивайте! Но поскольку этот вопрос цитируется старым и без ответа, я думаю, что нет большого интереса, и я сохраняю время объяснения HTTP и снятия скриншотов.

  • 2
    Ха, столкнулся с этим раньше тоже. Другое решение - использовать Base64.NO_WRAP. Это исправило мои проблемы в последний раз, по крайней мере;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню