我想要在Spring的响应式WebClient发出的HTTP请求中AWS sign。为了签名请求,我需要访问以下内容:URL、HTTP方法、查询参数、头部和请求正文字节。
我开始编写ExchangeFilterFunction。由于ClientRequest接口,我可以访问所有我需要的东西,除了请求正文:
在早期的Spring版本中,我们使用RestTemplate和ClientHttpRequestInterceptor。在这种情况下,正文的字节被公开,因此可以进行签名。
我看到在WebClient的情况下,Spring将正文处理为Publisher,所以我不确定ExchangeFilterFunction是否是一个好的起点。
我应该如何签署HTTP请求?
我开始编写ExchangeFilterFunction。由于ClientRequest接口,我可以访问所有我需要的东西,除了请求正文:
@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());
}
}
在早期的Spring版本中,我们使用RestTemplate和ClientHttpRequestInterceptor。在这种情况下,正文的字节被公开,因此可以进行签名。
我看到在WebClient的情况下,Spring将正文处理为Publisher,所以我不确定ExchangeFilterFunction是否是一个好的起点。
我应该如何签署HTTP请求?
request.body().toString().getBytes()
来获取字节吗? - Toerktumlare