Точный точный запрос CURL с использованием RestTemplate - PullRequest
1 голос
/ 09 января 2020

Я с трудом пытаюсь реплицировать команду curl с помощью RestTemplate при загрузке файлов в AWS S3.

Ниже curl работает хорошо, однако при использовании шаблона rest это не работает, так как внутренне оно изменяет некоторые символы.

curl -v  \
    -H "Content-Type:application/octet-stream" \
    -H "Content-Length:5242880" \
    --upload-file /Users/fd/Downloads/xaa \
    'https://video-uploads-prod.s3-accelerate.amazonaws.com/ABCDEFQGfwwGyO2DKbQ/aws-userUploadedVideo?uploadId=qkpiUI.3zRrO6N0K2ThRJNEjeCJ90xKm5GvLyt92bGvn_CgHSRohbuVcPxubnHs5UhtIF2m.92umUHS1ScLxHT09ObrtYsDNKoPCYMtX.og5GH2jJFJzTwowHPR2NATP&partNumber=1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200108T153659Z&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost&X-Amz-Expires=86399&X-Amz-Credential=ABCDEZHLABCWZ2MUPPBQ%2F20200108%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=abcde94e1a87d2169ce000d5b1275d422c66360136e0488d9714db4f12199740'

Вывод curl:

* We are completely uploaded and fine
< HTTP/1.1 200 OK

Я использую java 8 с Spring Boot 1.5.6. Код java, который я использовал:

byte[] media = //video in mp4//;
String uploadUrl = "https://video-uploads-prod.s3-accelerate.amazonaws.com/ABCDEFQGfwwGyO2DKbQ/aws-userUploadedVideo?uploadId=qkpiUI.3zRrO6A0B2ThRCDEjeCJ90xKm5GvLyt92bGvn_CgHSRohbuVcPxubnHs5UhtIF2m.92umUHS1ScLxHT09ObrtYsDNKoPCYMtX.og5GH2jJFJzTwowHPR2NATP&partNumber=1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200108T153659Z&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost&X-Amz-Expires=86399&X-Amz-Credential=ABCDEZHLABCWZ2MUPPBQ%2F20200108%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=abcde94e1a87d2169ce000d5b1275d422c66360136e0488d9714db4f12199740";

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(APPLICATION_OCTET_STREAM);
headers.set("Content-Length", "5242880");

HttpEntity entity = new HttpEntity<>(media, headers);

ResponseEntity<String> respEntity = restTemplate.exchange(uploadUrl, PUT, entity, String.class);

В ответ я получаю, что подпись не совпадает:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>ABCDEFQGfwwGyO2DKbQ</AWSAccessKeyId>...

Я пробовал несколько подходов с restTemplate.exchange, например: используя UriComponentsBuilder вместо простой url строки, используя URI, используя декодированную строку url, но не нашел способа вызвать буквенный URL и избегая RestTemplate для изменения URL.

Я знаю, что могу вызвать curl команда из Java, но я хочу знать , как вызвать литеральный URL с помощью RestTemplate, чтобы воспроизвести точное поведение как curl и избежать RestTemplate, чтобы изменить его . Возможно ли это или я не могу использовать RestTemplate для этой цели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...