422 при публикации файла с запросами

#python #api #curl #request

Вопрос:

Итак, я пытался разобраться в этом весь день, но не смог добиться никакого прогресса. У меня есть эта команда curl, которая работает:

 curl -X POST -H "x-hermes-key: <KEY>" -H "Accept: application/json"  --form file='@example_files/ex1.pdf' <URL> -kv 
 

Когда я пытаюсь запустить его эквивалент на python с запросами, я получаю ошибку 422:

 header = {
            "Accept": "application/json",
            "X-Hermes-Key": <KEY>
        }

f = {'file': open("example_files/ex1.pdf", "rb")}
r_create = requests.post(url=<URL>, headers=header, files=f)
 

Кто-нибудь может помочь мне увидеть, где я совершаю ошибку?

Комментарии:

1. Попробуйте это: с open(‘example_files/ex1.pdf’, ‘rb’) как f: requests.post(url= url, заголовки = заголовок, данные = f)

2. f['file'] я думаю, это должен быть кортеж. См. curlconverter .

3. @CodeMonkey Затем выдает ошибку декодирования, также пробовал с files=f

4. @rv.kvetch Это определено выше, я отредактирую свой пост, чтобы включить его

5. @rv.kvetch тоже пробовал, не повезло

Ответ №1:

Следующее должно соответствовать команде curl и POST с content-type=multipart/form-data .

Вы можете явно указать имя файла, content_type и заголовки в кортеже для значения ‘file’.

 headers = {
            "Accept": "application/json",
            "X-Hermes-Key": <KEY>
        }

url = <URL>

files = [('file', ('ex1.pdf', open('example_files/ex1.pdf', 'rb'),
                     'application/octet-stream'))]
r = requests.post(url=url, headers=headers, files=files)
print(r.status_code)
 

Комментарии:

1. Это было почти все! Просто замена «загрузить» на «файл» решила проблему, большое вам спасибо!