Java android上具有授权的HTTP POST请求

Java android上具有授权的HTTP POST请求,java,android,http,authorization,request,Java,Android,Http,Authorization,Request,当我从HttpPost用setHeader设置“Authorization”头时,主机名从请求中消失,并且总是返回错误400(错误请求)。同样的代码在纯java(没有android)上运行良好,当我在android上删除设置“Authorization”头时,也可以正常运行,但我需要授权。 这是一个代码(域已更改): 和access.log中的记录(IP已更改): 在android上调用相同的代码时,我会在日志中看到: POST /test.php HTTP/1.1 Accept: applic

当我从HttpPost用setHeader设置“Authorization”头时,主机名从请求中消失,并且总是返回错误400(错误请求)。同样的代码在纯java(没有android)上运行良好,当我在android上删除设置“Authorization”头时,也可以正常运行,但我需要授权。 这是一个代码(域已更改):

和access.log中的记录(IP已更改):

在android上调用相同的代码时,我会在日志中看到:

POST /test.php HTTP/1.1
Accept: application/json
User-Agent: Apache-HttpClient/4.1 (java 1.5)
Host: myhost.com
Authorization: Basic YnxpcYRlc3RwMTulHGhlSGs=

Content-Length: 21
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Encoding: UTF-8
Connection: Keep-Alive
Expect: 100-Continue


2011-02-23 15:45:10: (response.c.128) Response-Header:
HTTP/1.1 400 Bad Request
Content-Type: text/html
Content-Length: 349
Connection: close
access.log:

1.1.1.1 - - [23/Feb/2011:15:45:10 +0100] "POST /test.php HTTP/1.1" 400 349 "-" "Apache-HttpClient/4.1 (java 1.5)"
如何在android上使用POST获得授权?
当我使用HttpURLConnection而不是HttpClient时,没有什么区别。

感谢Samuh的提示:) 插入了一个额外的换行符,它在GET请求中没有意义,但在POST请求中很重要。 这是在android中生成授权头的正确方法(在本例中为getB64Auth):

缺少Base64.NO_WRAP标志。

只需使用以下命令:

String authorizationString = "Basic " + Base64.encodeToString(
                        ("your_login" + ":" + "your_password").getBytes(),
                        Base64.NO_WRAP); //Base64.NO_WRAP flag
                post.setHeader("Authorization", authorizationString);

授权和内容长度标题之间有多余的一行吗?是的,有多余的一行,但只有当请求从android发送时才有。这救了我,我用base64.default代替base64.URL_SAFE | base64.NO_WRAPAmazing!有人能解释为什么行尾在post中很重要,但不能得到请求吗?@Koral:你的解决方案对身份验证挑战真的很有帮助。谢谢我的朋友,
Base64.URL\u SAFE | Base64.NO\u WRAP
POST /test.php HTTP/1.1
Accept: application/json
User-Agent: Apache-HttpClient/4.1 (java 1.5)
Host: myhost.com
Authorization: Basic YnxpcYRlc3RwMTulHGhlSGs=

Content-Length: 21
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Encoding: UTF-8
Connection: Keep-Alive
Expect: 100-Continue


2011-02-23 15:45:10: (response.c.128) Response-Header:
HTTP/1.1 400 Bad Request
Content-Type: text/html
Content-Length: 349
Connection: close
1.1.1.1 - - [23/Feb/2011:15:45:10 +0100] "POST /test.php HTTP/1.1" 400 349 "-" "Apache-HttpClient/4.1 (java 1.5)"
 private String getB64Auth (String login, String pass) {
   String source=login+":"+pass;
   String ret="Basic "+Base64.encodeToString(source.getBytes(),Base64.URL_SAFE|Base64.NO_WRAP);
   return ret;
 }
String authorizationString = "Basic " + Base64.encodeToString(
                        ("your_login" + ":" + "your_password").getBytes(),
                        Base64.NO_WRAP); //Base64.NO_WRAP flag
                post.setHeader("Authorization", authorizationString);