Как использовать поля формы в одном порядке для файла загрузки Amazon S3 с использованием предварительно подписанного URL - PullRequest
1 голос
/ 29 мая 2020

У меня есть предварительно заданный URL-адрес Amazon S3. Я хочу использовать его в файле функций Karate для загрузки файла (скажем: pdf)

Вот пример запроса Curl, который мне нужно выполнить с помощью запроса POST Karate

curl --location --request POST '<s3bucketURL>' \
--form 'key=some_key_fileName' \
--form 'x-amz-meta-payload={JsonObject}' \
--form 'Content-Type=application/pdf' \
--form 'bucket=<BucketName>' \
--form 'X-Amz-Algorithm=AWS4-HMAC-SHA256' \
--form 'X-Amz-Credential=<AWS_Credential>' \
--form 'X-Amz-Date=<Date>' \
--form 'Policy=<Policy_Hash>' \
--form 'X-Amz-Signature=<Signature_Hash>' \
--form 'file=@/Users/sahildua/validfile.pdf'  

I получил ответ (с preSignedUrl) от сервера и использовал код ниже в файле функций

  "url": "<s3bucketURL>",
  "fields": {
    "key": "some_key_fileName",
    "x-amz-meta-payload": "{JsonObject}",
    "Content-Type": "application/pdf",
    "bucket": "<BucketName>",
    "X-Amz-Algorithm": "AWS4-HMAC-SHA256",
    "X-Amz-Credential": "<AWS_Credential>",
    "X-Amz-Date": "<Date>",
    "Policy": "<Policy_Hash>",
    "X-Amz-Signature": "<Signature_Hash>"

Я пробовал

Given url response.url
* def fieldData = response.fields
* print fieldData
* form fields fieldData
And multipart file file = { read: '../testData/validPdfFile.pdf'}
When method post
Then match responseStatus ==  204

Я вижу формат запроса журнала карате как : 18: 29: 08.560 [ForkJoinPool-1-worker-3] DEBUG com.intuit.karate - запрос:

2 > POST https://s3.amazonaws.com/devtest
2 > Accept-Encoding: gzip,deflate
2 > Connection: Keep-Alive
2 > Content-Length: 10485
2 > Content-Type: multipart/form-data; boundary=xdW8JqUa4Z2DxRAQSN1i0LntgmN8ZII7VEBuJUs
2 > Host: s3.amazonaws.com
2 > User-Agent: Apache-HttpClient/4.5.11 (Java/13.0.1)

18:29:10.891 [ForkJoinPool-1-worker-3] DEBUG com.intuit.karate - response time in milliseconds: 2328.56
2 < 400
2 < Connection: close
2 < Content-Type: application/xml
2 < Date: Fri, 29 May 2020 12:59:09 GMT
2 < Server: AmazonS3
2 < Transfer-Encoding: chunked
2 < x-amz-id-2: IA9kNim1i7HTUx5RpMmyT34KrRdRj1UfbKGtiWQ7uoj4virV8Oq2UMU8vY/OBqn7T2SLk8VVgo4=
2 < x-amz-request-id: BF19F92FE6DB16E2
<?xml version="1.0" encoding="UTF-8"?>

Я вижу, что данные формы даже не передаются в фактическом запросе Но я получаю проверка XML ошибка Amazon S3 из-за неправильного порядка значений полей

<Error> 
<Code>InvalidArgument</Code> 
<Message>Bucket POST must contain a field named 'key'. If it is specified, please check the order of the fields.</Message>
<ArgumentName>key</ArgumentName>
<ArgumentValue></ArgumentValue> 
<RequestId><id></RequestId> 
<HostId><someid></HostId> 
</Error>

Я ожидаю, что 204 No Content и файл будет загружен в корзину S3

1 Ответ

2 голосов
/ 29 мая 2020

Я просто использовал составные поля вместо полей формы, и это сработало. Изменено: * form fields fieldData на And multipart fields fieldData

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