【问题标题】:HTTP error code : 400HTTP错误代码:400
【发布时间】:2015-12-23 15:04:25
【问题描述】:

我正在尝试从 REST url 下载文件。这是我使用的代码

byte[] plainCredsBytes ="mytoken".getBytes();
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);
URL url = new URL("https://api.xxxxx.com/files/62645/6hSFcVs3qIbvrGdXOfYzXQ/Test.png");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "text/plain; charset=utf-8");
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Authorization", "Basic " + base64Creds);

我收到 java.lang.RuntimeException: Failed : HTTP error code : 400

我试图从响应中获取更多详细信息,这里是

<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>Basic M2U3YzMzODU3NmY3ZjgwNzY2OWU5Yzg5NDg0Y2Y3Mzc=     </ArgumentValue>
<RequestId>7BDEA0EBE74A63FF</RequestId>
<HostId>qU+xjS3nRcTbyBHPZyM89tGZC46sa9XzhkDLPD+p4oOSQc1UF9vSnpqB7A6Mlp5s76iqCOY2n+0=</HostId>
</Error>

我正在传递基本授权凭据,如果我删除它,我会得到
HTTP 错误代码:401 {"message":"Requires authentication"}

有什么帮助吗?

【问题讨论】:

  • 如何设置 base64Creds 变量?你能发布那个代码吗?
  • @user2953113 修改代码以包含它
  • 试试用户名+“:”+密码。字符串 userCred = 用户名 + ":" + 密码;字符串编码授权 = Base64.encodeBase64(userCred.getBytes());
  • @user2953113 我尝试使用用户名:密码它不起作用

标签: java rest http-headers


【解决方案1】:

我收到 400 Bad request,因为我调用的服务验证了我的身份验证并将其重定向到不需要身份验证的亚马逊服务,因此它抱怨该请求。

我必须禁用跟随重定向并获取位置,然后发送另一个请求以获取文件

conn.setInstanceFollowRedirects(false);

实际上我为 poc 做的上述程序,我的实际客户使用的是 spring rest 模板。 ClientHttpRequestFactory 的默认实现为 GET 设置了 setInstanceFollowRedirects(true),所以我必须创建一个自定义 ClientHttpRequestFactory。

public class CustomClientHttpRequestFactory extends SimpleClientHttpRequestFactory {

@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
    .....
}

}

【讨论】:

    最近更新 更多