Я пытаюсь подключиться к конечной точке API для загрузки файла изображения (python3.6 и запросы).
Загрузка должна быть авторизована, что достигается с помощью токена авторизации.Я успешно протестировал API с Почтальоном и cURL.Рабочая команда cURL:
curl -X POST 'https://example.com/api/upload'
-H 'Accept: application/json'
-H 'Authorization: bearer <TOKEN>
-F 'image=@19JA_slingua_IMG_3798-1600x800.jpg'
, что приводит к ответу:
200 OK
{"data":{"id":"<image ID>","type":"image"}}
Мой код Python, использующий библиотеку запросов, в основном выглядит следующим образом:
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'bearer <TOKEN>',
}
files = {
'image': ('19JA_slingua_IMG_3798-1600x800.jpg',
open('19JA_slingua_IMG_3798-1600x800.jpg', 'rb')),
}
response = requests.post('https://example.com/api/upload',
headers=headers, files=files)
Это, однако, возвращает 500 Внутренняя ошибка сервера .
Я проверил подготовленный запрос, который выглядит следующим образом
POST https://example.com/api/upload
Authorization: bearer <TOKEN>
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100
Safari/537.36
Accept: application / json
Content-Length: 585218
Content-Type: multipart/form-data; boundary=d5c1db2b1bcb448b8e9e6fe852402a90
b'--d5c1db2b1bcb448b8e9e6fe852402a90\r\nContent-Disposition: form-
data; name="image"; filename="19JA_slingua_IMG_3798-
1600x800.jpg"\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\
x00\x01\x00\x00\xff\xdb\x00\x84\x00\x02\x01\x01\x01\x01\x01\x02\x01\x01\x0
1\x02\x02\x02\x02\x02\x04\x03\x02\x02\x02\x02\x05\x04\x04\x03\x04\x06\x05\
x06\x06\x06\x05\x06\x06\x06\
Я ударил стену какк тому, что нужно сделать, чтобы беда стреляла.
РЕДАКТИРОВАТЬ:
Я решил проблему, включив в запрос тип контента (MIME-тип).Это может быть характерно для сервера.
import requests
img_path = 'path/to/img.jpg'
headers = {'Authorization': 'bearer %s' % TOKEN,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Accept': 'application/transit+json',
}
files = {'image': (img_path.split('/')[-1], open(img_path, 'rb'), 'image/jpeg')}
response = requests.post(ENDPOINT_URL, files=files, headers=headers)
Спасибо за поддержку!