基本認証を使用して Android の Web サービスと通信しています。これは、次のようなヘッダーを送信していることを意味します
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 );