首页 > 解决方案 > 当 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();
}

标签: amazon-s3okhttp

解决方案


推荐阅读