HttpUriRequest#addHeader(...)正在根除我的实体

时间:2013-04-17 14:34:58

标签: android http-request

我正在使用基本身份验证与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);

然后看看fiddler中的请求,我可以像预期的那样看到正文,但显然服务器拒绝了未经授权的请求。

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 );

1 个答案:

答案 0 :(得分:2)

只需跟进我的评论即可获得解决方案。

在大多数情况下,我发现当Auth标头中的base64编码的String无效时,服务器往往表现得很奇怪。因此,请验证授权标头是否正确。

一般来说,最好先尝试卷曲这类东西。以下是curl

的示例命令
curl -X POST -H "Authorization: Basic <base64-encoded String>" http://some.server.url.com/some-endpoint

我看到你添加了trim()来修复它。真正的解决方案是使用Base64.NO_WRAP(http://developer.android.com/reference/android/util/Base64.html#NO_WRAP)。所以你想在编码时这样做:

Base64.encodeToString( APP_STRING.getBytes() , Base64.NO_WRAP );

我应该注意到第一次出现但无论如何,我很高兴我的第一次想到会得到你的答案: - )