http: From python запрос к эквивалентной команде curl - PullRequest
1 голос
/ 29 мая 2020

Я хочу сделать загрузку на Amazon s3 через MS-Flow. Сообщение http через python выглядит так

    with open('../myfile.txt', 'rb') as f:
        files = {'file': (object_name, f)}
        http_response = requests.post(
            <aws-s3-url>, 
            data={
                'key': 'myfile.txt', 
                'x-amz-algorithm': 'AWS4-HMAC-SHA256', 
                'x-amz-credential': '<creds>',
                'x-amz-date': '20200529T120357Z', 
                'policy': '<policy>', 
                'x-amz-signature': '<signature>'
            }, 
            files=files
        )

Необработанное тело запроса и заголовки выглядят следующим образом

--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="key"

myfile.txt
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-algorithm"

AWS4-HMAC-SHA256
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-credential"

<creds>
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-date"

20200529T120357Z
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="policy"

<policy>
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-signature"

<signature>
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="file"; filename="myfile.txt"

test test test
--ed1fdd226f0d04d8691a17ceaf914a7e--

и

{'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '1287', 'Content-Type': 'multipart/form-data; boundary=ed1fdd226f0d04d8691a17ceaf914a7e'}

Отправка запроса через python работает нормально. Но когда я использую необработанное тело HTTP-запроса в MS-Flow или через curl, оно не работает с

The body of your POST request is not well-formed multipart/form-data.

Команда curl, которую я использую, -

curl \
-d "--ed1fdd226f0d04d8691a17ceaf914a7e\r\nContent-Disposition: form-data; name="key"\r\n\r\nmyfile.txt\r\n--ed1..." \
-X POST \
-H "Content-Type: multipart/form-data" \
-H "boundary: ed1fdd226f0d04d8691a17ceaf914a7e" \
-H "Accept': */*" \
-H "Connection': keep-alive" \
-H "Accept-Encoding': gzip, deflate" \
<aws-s3-url>

Я также использовал

-d "$(cat body)"

вместо исходной строки. Это изменило перенос строки с «\ r \ n» на «\ n», но не помогло.

У меня двоякий вопрос:

  1. Как правильно получить рабочий curl из приведенного выше запроса python? (Возможно, даже правильный формат тела, который мне нужно будет ввести в MS-Flow)
  2. Почему мой подход не работает?

Был бы рад, если бы кто-то мог помочь. Заранее большое спасибо и хорошего дня!

1 Ответ

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

--data псевдоним -d кодирует заданную строку с помощью URL-кодировки. Используйте --trace -, чтобы увидеть результирующий беспорядок, который отправляется на сервер.

Если вы уже закодировали такие данные, вам нужно вместо этого использовать --data-binary.

Вы также можете использовать -F key=value, чтобы указать каждое поле по отдельности и отправить их как данные из нескольких частей, что менее подвержено ошибкам, поскольку вам не нужно выполнять кодирование самостоятельно.

...