我试图让我的简单应用在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
请求会在姜饼上失败?
答案 0 :(得分:2)
我知道,旧线程,但我遇到了同样的问题,并没有在这里找到解决方案。所以我调查了一下,发现问题对我来说是什么。不过,我们使用Volley。
实际问题是使用以下代码时:
String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
headers.put("Authorization", auth);
当我们干脆做的时候
headers.put("Authorization", "Basic asd123ASD123asd");
它有效。
<强>为什么吗
好吧,我不知道为什么 Android 2.3的行为与新的Androids不同,当然,Base64.encodeToString()
引入了一个新的行字符。我认为我们使用Wireshark。这个新行将HTTP标题分成两个,因此您从服务器获得两个响应,后者是400 Bad Request,它显示在Logcat中。
如果有人对我如何理解这一点感兴趣,请不要犹豫!但由于这个问题引用旧而没有回应,我想没有太多兴趣,我节省了解释HTTP和截图的时间。