Я пытаюсь заставить мое простое приложение работать на 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
завершился неудачей на прянике?
Я знаю, старый поток, но я столкнулся с той же проблемой и не нашел здесь решения. Поэтому я исследовал и нашел, что проблема для меня. Однако мы используем 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 и снятия скриншотов.