ошибка при загрузке файла (библиотека requests)

VOLAND

Новичок
Пользователь
Ноя 4, 2020
3
0
1
есть код на powershell:
$LoadDocumentUri = "api/common/v1/documents"
$File = "C:\apptest\activate.pdf";
$Boundary = [System.Guid]::NewGuid().ToString();
$File1 = [IO.FILE]::ReadAllBytes($File);
$bodylines = @(
"--$boundary",
"Content-Disposition: form-data; name=`"files`"; filename=`"activate.pdf`"",
"Content-Type: application/octet-stream$LF",
$File1,
"--$boundary",
"Content-Disposition: form-data; name=`"metadata`"",
"Content-Type: application/json$LF",
$metadata
"--$boundary--$LF"
) -join $LF
$ContentType = "multipart/form-data; boundary=`"$boundary`""

Пытаюсь переделать его на python и получаю 500 ошибку от сервера:
import requests
url = "https://auto.ru/api/common/v1/documents" #адрес не публичный во внутренней сети
payload={'metadata': '{"requestId":"00000000-0000-0000-47ad-7b37414f381b","uploadTarget":"1","fileType":"102"}'}
files=[('files', open('activate.pdf','rb'))]
headers['Content-Type']='application/octet-stream'
response = requests.request("POST", url, headers=headers, data=payload, files=files,verify=False)
print(response)

В чем может быть причина?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
возможно, в этом дело, вы файл открыли но не прочитали его
попробуйте так
Python:
import requests

url = "https://auto.ru/api/common/v1/documents"  # адрес не публичный во внутренней сети
payload = {'metadata': '{"requestId":"00000000-0000-0000-47ad-7b37414f381b","uploadTarget":"1","fileType":"102"}'}
with open('activate.pdf', 'rb') as f:
    files = f.read()
headers['Content-Type'] = 'application/octet-stream'
response = requests.request("POST", url, headers=headers, data=payload, files=files, verify=False)
print(response)
 
Последнее редактирование:

VOLAND

Новичок
Пользователь
Ноя 4, 2020
3
0
1
Спасибо за ответ! К сожалению не помогло. Причем если устанавливаю headers['Content-Type'] = 'application/octet-stream' то получаю http код 415,
если устанавливаю headers ["Content-Type"]='multipart/form-data' то получаю 500 ошибку сервера.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
вообще строка headers['Content-Type'] = .... должна ошибку вызывать, так как headers до этого не определен
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Попробуйте так:
Python:
url = "https://auto.ru/api/common/v1/documents"
payload = {'metadata': '{"requestId":"00000000-0000-0000-47ad-7b37414f381b","uploadTarget":"1","fileType":"102"}'}
files = {'file': open('activate.pdf', 'rb')}
headers = {'Content-Type': 'application/octet-stream'}
response = requests.request("POST", url, headers=headers, data=payload, files=files, verify=False)
print(response)
или так (возможно в payload['metadata'] нужен словарь, а не строка):
Python:
url = "https://auto.ru/api/common/v1/documents"
payload = {'metadata': {"requestId":"00000000-0000-0000-47ad-7b37414f381b","uploadTarget":"1","fileType":"102"}}
files = {'file': open('activate.pdf', 'rb')}
headers = {'Content-Type': 'application/octet-stream'}
response = requests.request("POST", url, headers=headers, data=payload, files=files, verify=False)
print(response)
 

VOLAND

Новичок
Пользователь
Ноя 4, 2020
3
0
1
К сожалению не один совет не помог.

при payload = {'metadata': {"requestId":"00000000-0000-0000-47ad-7b37414f381b","uploadTarget":"1","fileType":"102"}} получаю HTTP 400 Bad Request


Попробовал с помощью Postman автоматически сформировать код на Python, но и он валится с 415 ошибкой. Причем при запросе через Postman от сервера возвращается валидный ответ.
Вот такой код сгенерировал Potsman.

import requests
url = "https://auto.ru/api/common/v1/documents"
payload={'metadata': '{"requestId":"00000000-0000-0000-47ad-7b37414f381b","uploadTarget":"1","fileType":"102"}'}
files=[
('files', open('activate.pdf,'rb'))
]
headers = {
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)
 

Форум IT Специалистов