我想AWS sign由Spring的响应WebClient触发我的HTTP请求。要签署请求,我需要访问以下内容:URL,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());
}
}
在较早的春季版本中,我们将RestTemplate与ClientHttpRequestInterceptor一起使用。在这种情况下,主体的字节是暴露的,因此可以签名。
如我在WebClient的情况下所见,Spring将身体作为Publisher处理,因此我不确定ExchangeFilterFunction是否是一个很好的起点。
我应该如何签名HTTP请求?