【问题标题】:Issue calling API gateway via Vertx client通过 Vertx 客户端调用 API 网关
【发布时间】:2020-04-05 15:55:13
【问题描述】:

我正在尝试使用 Vertx Webclient 连接到 AWS API 网关:

        HttpRequest<Buffer> request = webClient.postAbs(targetHost);
        request.putHeader("Authorization", auth);
        request.putHeader("Content-Type", contentType);
        request.putHeader("Host", hostName);

        request.sendJson(new JsonObject(jsonData), response -> {
        if (response.succeeded()) {
        final JsonObject result = response.result().bodyAsJsonObject();
        logger.info(result.toString());
        routingContext.response()
        .setStatusCode(200)
        .putHeader("Content-Type", "application/json")
        .end(result.toString());
        } else {
        logger.error(response.cause().getMessage());
        routingContext.fail(new Exception(response.cause().getMessage()));
        }
        });

并且总是收到相同的错误响应,即我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。

但如果我使用 javax.ws.rs.client.WebTarget,

        Client client = ClientBuilder.newClient();
        WebTarget target = client.target(targetHost);

        response=target.request()
        .header("Authorization", auth)
        .header("Content-Type", contentType)
        .header("Host", hostName)
        .post(jsonData,Response.class);

我能够收到正确的回复。

知道 Vertx 网络客户端的不同之处吗?

【问题讨论】:

  • contentSha256 是如何计算的?在 Vert.x 示例中,您让 vert.x 创建 json 字符串,但在 JAX-RS 示例中,它似乎是手动创建的
  • 它通常是一个 json 字符串.. 我尝试在两个调用中使用相同的行为并没有帮助..
  • contentSha256 只是 json 字符串的 sha256 值。我发现的另一件事是 Vertx 在内部将 443 之类的端口分配给主机名,这对于典型的 Rest 端点调用不是必需的...有没有办法解决这个问题?

标签: vert.x


【解决方案1】:

所以我们发现了问题,原来我们使用的 json 数据没有在 Vertx 实现中正确传递。

所以我们可以创建一个新的 JSONObject,创建数据并使用这个对象来评估 aws 签名,并在实际的 API 调用中传递相同的对象。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2020-04-20
    • 2015-12-12
    • 2020-02-15
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多