当前位置: 首页 > 知识库问答 >
问题:

Android-具有基本身份验证的HttpClient JSON POST

巢皓君
2023-03-14

我正在尝试实现一个简单的JSON发布到URL,该URL在ANDROID上接受JSON正文中的基本身份验证。

我尝试过使用 HttpUrl 连接,但我被“未经授权”,我的数据被发送到服务器。

我尝试的另一种方法是使用HttpClient,但现在我遇到了一个不同的问题。身份验证工作完美,但数据没有发送到服务器...

为了确保,我在一个简单的Java项目(不是Android环境)中设置了一个小测试。

这是我用来开机自检到服务器的代码:

DefaultHttpClient httpClient = new DefaultHttpClient();
ResponseHandler<String> resonseHandler = new BasicResponseHandler();
HttpPost postMethod = new HttpPost("http://localhost/api/v1/purchase/");    
postMethod.setEntity(new StringEntity("{\"amount_adult\" : 1, \"object_id\" : 13}"));
postMethod.setHeader( "Content-Type", "application/json");
String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
postMethod.setHeader("Authorization", authorizationString);
String response = httpClient.execute(postMethod,resonseHandler);
System.out.println("response :" + response);

Java项目中的代码运行良好。

当我在Android中尝试完全相同的代码时,我从服务器收到内部服务器错误,这意味着尚未收到JSON数据。

我真的不明白为什么这在JAVA中有效,而在Android中无效。

我想达到的效果是以下命令:

curl --dump-header - -H "Content-Type: application/json" -X
POST --data '{"amount_adult":1, "object_id":13}' 
--user travelbuddy:travelbuddy http://localhost/api/v1/purchase/

共有3个答案

郑景胜
2023-03-14

我认为最简单的方法是:

postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false));
郎志
2023-03-14

最后,一切都被排序了。任何可能遇到以下问题的人都是解决方案。

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
postMethod.setHeader("Authorization", authorizationString);

这个Base64.encodeToString在授权字符串的末尾追加一个额外的“\n”。然后在服务器上“\n”字符后的下一行被视为请求体,当然是不正确的。

通过替换授权字符串中的所有新行,可以解决这个问题:

    String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
authorizationString.replace("\n", "");
    postMethod.setHeader("Authorization", authorizationString);

修复容易,但很难找到;-)

高修伟
2023-03-14
String authorizationString = "Basic " + Base64.encodeToString(
    ("travelbuddy" + ":" + "travelbuddy").getBytes(),
    Base64.DEFAULT);

...

解决方案实际上更简单一些:

    String authorizationString = "Basic " + Base64.encodeToString(
        ("travelbuddy" + ":" + "travelbuddy").getBytes(),
        Base64.NO_WRAP); // <=== Do not add '\n'
 类似资料:
  • 问题内容: 我必须 使用 HTTP Basic身份验证从http服务器下载和解析XML文件。现在,我这样做: 但是以这种方式,我无法从具有http身份验证的服务器获取xml(或者我只是根本不知道该文档)文档。 如果您能向我展示实现我的目标的最好,最简单的方法,我将不胜感激。 问题答案: 您可以使用。例如: 这将设置默认值,并将在 所有 请求中使用。显然,当您不需要所有请求的凭据或多个不同的凭据(可

  • 问题内容: 使用HttpUrlConnection使用抢占式基本HTTP身份验证的最佳方法是什么。(假设现在我不能使用HttpClient)。 编辑以澄清问题:我使用Base64编码在请求标头中正确设置了un / pw。是否需要设置任何其他标志或属性,或者我是否在为请求的基本身份验证头设置抢先式基本身份验证所需的全部信息? 问题答案: 如果您使用的是Java 8或更高版本,则可以使用: 然后正常使

  • 问题内容: 从HttpClient 4.3开始,我一直在使用HttpClientBuilder。我正在连接到具有基本身份验证的REST服务。我将凭据设置如下: 但是,这不起作用(我正在使用的REST服务返回401)。怎么了? 问题答案: 从此处的 抢先身份验证 文档中: http://hc.apache.org/httpcomponents-client- ga/tutorial/html/aut

  • 问题内容: 我们在Spring 3.0中将RestTemplate与xml配置一起使用,并且运行良好。 但是,当我们尝试迁移到Spring 3.1版本时,不建议使用CommonsClientHttpRequestFactory类,并且不再使用commons HttpClient。 我试图使用HttpComponentsClientHttpRequestFactory类和Apache HttpCli

  • 问题内容: Jsoup中是否可以通过基本访问身份验证从网站加载文档? 问题答案: 使用HTTP基本访问身份验证时,您需要发送标头以及一个值。 例如(在Apache Commons Codec Base64的 帮助下): (为了简便起见,省略了字符编码的明确说明,因为登录名和密码通常很简单;此外,Base64总是生成字节)

  • 我不能在我的一个路径上设置基本身份验证。我希望有路径由基本auth保护,所有其他路径不需要基本auth。所以我创建了两个指向同一个后端的入口文件: 非授权入口: 认证入口: 所有秘密都设置正确。我错过了什么?我如何才能让它发挥作用?