Java 使用AWS签署Spring WebClient HTTP请求

Java 使用AWS签署Spring WebClient HTTP请求,java,spring,amazon-web-services,reactive-programming,spring-webflux,Java,Spring,Amazon Web Services,Reactive Programming,Spring Webflux,我希望我的HTTP请求由Spring的reactive启动。要签署请求,我需要访问以下内容:URL、HTTP方法、查询参数、标题和请求正文字节 我从写一篇文章开始。由于接口,我可以访问除请求正文之外的所有我需要的内容: @Component public class AwsSigningInterceptor implements ExchangeFilterFunction { private final AwsHeaderSigner awsHeaderSigner; pu

我希望我的HTTP请求由Spring的reactive启动。要签署请求,我需要访问以下内容:URL、HTTP方法、查询参数、标题和请求正文字节

我从写一篇文章开始。由于接口,我可以访问除请求正文之外的所有我需要的内容:

@Component
public class AwsSigningInterceptor implements ExchangeFilterFunction
{
    private final AwsHeaderSigner awsHeaderSigner;

    public AwsSigningInterceptor(AwsHeaderSigner awsHeaderSigner)
    {
        this.awsHeaderSigner = awsHeaderSigner;
    }

    @Override
    public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next)
    {
        Map<String, List<String>> signingHeaders = awsHeaderSigner.createSigningHeaders(request, new byte[]{}, "es", "us-west-2"); // should pass request body bytes in place of new byte[]{}

        ClientRequest.Builder requestBuilder = ClientRequest.from(request);

        signingHeaders.forEach((key, value) -> requestBuilder.header(key, value.toArray(new String[0])));

        return next.exchange(requestBuilder.build());
    }
}
@组件
公共类AwsSigningInterceptor实现ExchangeFilter函数
{
私人最终AwsHeaderSigner AwsHeaderSigner;
公共AwsSigningInterceptor(AwsHeaderSigner AwsHeaderSigner)
{
this.awsHeaderSigner=awsHeaderSigner;
}
@凌驾
公共Mono筛选器(ClientRequest请求,ExchangeFunction下一步)
{
Map signingHeaders=awsHeaderSigner.createSigningHeaders(请求,新字节[]{},“es”,“us-west-2”);//应传递请求正文字节以代替新字节[]{}
ClientRequest.Builder requestBuilder=ClientRequest.from(请求);
signingHeaders.forEach((key,value)->requestBuilder.header(key,value.toArray(新字符串[0]);
返回next.exchange(requestBuilder.build());
}
}
在较旧的spring版本中,我们使用了一个。在这种情况下,主体的字节是公开的,因此可以进行签名

正如我在Spring的例子中看到的,它将身体作为一个整体来处理,所以我不确定a是否是一个好的起点


我应该如何签署HTTP请求?

您不能通过
request.body().toString().getBytes()
?@ThomasAndolf no获取字节,因为它返回的是一个BodyInserter,而不是实际的body。看:现在可能吗?据我所知不可能。在发送请求之前,我通过序列化请求体和计算签名头解决了这个问题。你能发送一段代码吗?