Я бы хотел AWS подписать мой HTTP-запрос, запущенный реактивным WebClient Spring. Для подписания запроса мне нужен доступ к следующим адресам: 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-запрос?