当前位置: 首页 > 面试题库 >

在Android上具有授权的HTTP POST请求

令狐弘益
2023-03-14
问题内容

当我从HttpPost中使用setHeader设置“
Authorization”标头时,主机名将从请求中消失,并且始终返回错误400(错误请求)。相同的代码在纯Java(没有android)上可以正常工作,并且当我在android上删除设置“
Authorization”标头时也可以正常工作,但是我需要授权。这是一个代码(域已更改):

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://myhost.com/test.php");
post.setHeader("Accept", "application/json");
post.setHeader("User-Agent", "Apache-HttpClient/4.1 (java 1.5)");
post.setHeader("Host", "myhost.com");
post.setHeader("Authorization",getB64Auth());
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("data[body]", "test"));
AbstractHttpEntity ent=new UrlEncodedFormEntity(nvps, HTTP.UTF_8);
ent.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
ent.setContentEncoding("UTF-8");
post.setEntity(ent);
post.setURI(new URI("http://myhost.com/test.php"));
HttpResponse response =client.execute(post);

方法getB64Auth()返回使用“ Base64”编码的“ login:password”,例如:“ YnxpcYRlc3RwMTulHGhlSGs
=“,但这并不重要。

在纯Java上调用上述代码时,这是lighttpd的error.log:

2011-02-23 15:37:36: (request.c.304) fd: 8 request-len: 308
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

HTTP/1.1 200 OK
Content-type: text/html
Transfer-Encoding: chunked

并从access.log记录(IP更改):

1.1.1.1 myhost.com - [23/Feb/2011:15:37:36 +0100] "POST /test.php HTTP/1.1" 200 32 "-" "Apache-HttpClient/4.1 (java 1.5)"

当在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中生成Authorization标头的正确方法(在本例中为getB64Auth):

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

缺少Base64.NO_WRAP标志。



 类似资料:
  • 所以,大家好。我在连接到服务器时遇到了一些问题。我曾与Yandex API和VK.COM API合作过,我的方法还不错。但是现在我不能从服务器得到任何响应。我想,我做得不对。 所以网站是https://android-test.7g-demo.com我还有API规范文件。以下是我在其中关于POST请求的内容。 > 请求(应用程序/json; charset=utf-8) > 头 身体 响应 200

  • 在使用旧Spring的RestTemplate与OAuth授权背后的一些API集成时,我正在进行以下操作: 然后GET会说: 作为一种解决办法,我使用Mono.FromCallable(...)包装了旧的RestTempate。我还尝试使用WebClient做一些定制客户机,它接受令牌和授权用户,然后对RESTAPI做第二次调用。但它不是很好,因为令牌可以过期,我将不得不执行更新过程。OAuth中

  • 问题内容: 我想向需要身份验证的服务器生成POST请求。我尝试使用以下方法: 但服务器未收到授权数据。应该添加授权数据的行如下: 和线 还抛出IOException。 无论如何,如果有人可以建议对以上逻辑进行任何修复,以启用带有UrlConnection的POST授权,我将非常感激。 但是显然,它不能像预期的那样起作用,尽管如果将相同的逻辑用于GET请求,则一切正常。 问题答案: 这里有一个很好的

  • 客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须设置为“token”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推

  • 客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须被设置为“code”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推

  • 问题内容: 我正在使用表前缀方法,以使多个客户端使用同一数据库。每个客户端创建的表数约为55。除了可以通过手动列出表格来进行所有授予之外,我还可以执行以下操作吗? 问题答案: 预告:这不是我的答案。我在http://lists.mysql.com/mysql/202610上找到了它,并且为了简单起见将其复制并粘贴到了Stephen Cook 您可以使用INFORMATION_SCHEMA.TABL