Следующая команда работает, но я не могу воспроизвести ее с помощью python-запросов (2.18.4):

curl -X POST -H "Authorization: Bearer ..." \
             -H "Content-Type: multipart/form-data" \
             -F 'metadata={...} 
             -F 'data=@data.bz2;type=application/octet-stream' 
              https://www....com

Используя нижеприведенные send_devices, я получаю «Unsupported Media Type»

def send_devices(basic_auth):
    endpoint_api = ' https://www....com'
    with open('data.bz2','rb') as payload:
        response = requests.post(endpoint_api, data={'metadata': ...,
                                                     'data': payload},
                                 headers={'Authorization': 'Bearer {0}'.format(basic_auth})

После некоторых комментариев я также попытался, и теперь ошибка «Недопустимые метаданные Json String»:

def send_devices(basic_auth):
    endpoint_api = ' https://www....com'
    files = {'file': ('data.bz2', open('data.bz2', 'rb'), 'application/octet-stream')}
    response = requests.post(endpoint_api, data={"metadata": {"extensions":{"urnType":"IDFA"}}},
                             files=files, headers={'Authorization': 'Bearer {0}'.format(basic_auth)})
1
Nadav 27 Фев 2018 в 15:57

3 ответа

Лучший ответ

В первом примере отсутствовал тип файла

'data': ('data.bz2', open('data.bz2', 'rb'), 'application/octet-stream'),

Во втором примере необходимо добавить дополнительные данные поста к тем же файлам dict. Даже если это не диктат

'metadata': ('metadata.csv', json.dumps({"extensions": ...}))}

Решение:

def send_devices(basic_auth):
    endpoint_api = ' https://www....com'
    files = {'data': ('data.bz2', open('data.bz2', 'rb'), 'application/octet-stream'),
            'metadata': ('metadata.csv', json.dumps({"extensions": ...}))}
    response = requests.post(endpoint_api, files=files,
                             headers={'Authorization': 'Bearer {0}'.format(basic_auth)})
1
Nadav 27 Фев 2018 в 14:56

Убедитесь, что содержимое правильно отформатировано. Похоже, что вы пропустили '{' в вашем втором объекте в вашей полезной нагрузке.

Код ответа об ошибке клиента HTTP 415 Unsupported Media Type указывает, что сервер отказывается принять запрос, потому что формат полезной нагрузки находится в неподдерживаемом формате.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/415

1
ehh123 27 Фев 2018 в 13:07

Вы должны поместить это как файл (не как данные).

r = requests.post(url, files={'file': open('data.bz2', 'rb')})

Работает отлично.

1
bugov 27 Фев 2018 в 13:08