我正在使用基本身份验证与 Android 中的网络服务交谈。这意味着我发送的标题看起来像
Authorization Basic [user:pass base 64 string here]
我正在设置我的请求:
public CreateUserService(Intent intent, int id) throws UnsupportedEncodingException {
super(id);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("email", intent.getStringExtra(FeedIntentService.EXTRA_UID)));
//and so on.
setupRequest(null, params);
}
然后在一个超类中我有一个方法
protected void setupRequest(List<Header> headers, List<NameValuePair> params) throws UnsupportedEncodingException {
mRequest = new HttpPost(getUri());
mRequest.addHeader(new BasicHeader("Authorization", "Basic " + AUTH_STRING));
//AUTH_STRING = the base 64 encoded user:pass pair
if(headers!=null) {
for(Header h: headers) {
mRequest.addHeader(h);
}
}
if(params!=null)
((HttpEntityEnclosingRequestBase) mRequest).setEntity(new UrlEncodedFormEntity(params));
}
问题是服务器没有收到我的请求正文。我在提琴手中阅读了请求,确实它似乎丢失了。但是,当我删除线
mRequest.addHeader(new BasicHeader("Authorization", "Basic " + AUTH_STRING);
并查看提琴手中的请求,我可以像预期的那样看到正文,尽管显然服务器拒绝了未经授权的请求。
AUTH_STRING 的编码如下:
private static final String APP_KEY = "user";
private static final String APP_SECRET = "pass";
private static final String APP_STRING = APP_KEY + ":" + APP_SECRET;
private static final String APP_BASE_64 = Base64.encodeToString( APP_STRING.getBytes() , Base64.DEFAULT );