amazon-s3 - 当 OkHttp 与 Postman、Unirest 和 HttpURLConnection 一起使用时,使用 OkHttp 的请求出现 HTTP 403 错误,请求使用 AWS 签名签名
问题描述
我正在尝试使用包含 Json 数据的 OkHttP 发出 POST 请求,但我收到 403 Forbidden 错误,错误消息是“我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方式。详情请查阅服务文档。
我不明白的是,当我使用 Unirest、HttpURLConnection 和 Postman 等不同的其他语言/软件发出相同的请求时,它工作得很好
这是我的 OkHttp 代码
MediaType JSON = MediaType.parse("application/json");
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.addHeader("Content-Type", "application/json; charset=utf-8")
.addHeader("Access-Key-Id", "KAIAYOSUOUKKYOI27I5M")
.addHeader("Open-Id", "ade06941a5be48479ea0dde364988c5e")
.addHeader("X-Amz-Date", "20211020T090849Z")
.addHeader("host", "api.xxxx.com")
.addHeader("Authorization", "AWS4-HMAC-SHA256 Credential=AKIAYOSUOUKKYOI27IM5/20211020/cn-north-1/execute-api/aws4_request,SignedHeaders=access-key-id;content-type;host;open-id;x-amz-date,Signature=dc217133d8d8d302d30747f2813257cb97d714b8e7594b5f2f038ad96e93cf3a")
.url(requestUrl)
.post(body)
.build();
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
解决方案
推荐阅读
- ios - 如何确定多个(n)日期时间范围何时相互重叠
- angular - 带有模拟用户输入的 RxJs/Ngrx TestSheduler (Jasmine)
- c# - 从 TreeView 中删除指定级别没有后代的所有项目
- php - 是否可以使用 PhpSpreadSheet 在现有的电子表格中写入?
- react-native - 如何通过反应导航组件更改父状态?
- angular - 如何以角度解析数字指定模式、小数分隔符和分组分隔符?
- asp.net-identity - IdentityServer Asp.net 客户端在超时时强制注销
- angular - isTokenExpired 方法返回 true 和 false
- c++ - 为什么要使用函数指针?
- swift - 如何在 swift 中使用 Yelp api v3