El siguiente comando funciona, pero no puedo reproducirlo usando python-request (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

Al usar send_devices a continuación, recibo "Tipo de medio no compatible" "

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})

Después de algunos comentarios, también lo intenté y el error ahora es "Cadena Json de metadatos no válida":

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 feb. 2018 a las 15:57

3 respuestas

La mejor respuesta

En el primer ejemplo, faltaba el tipo de archivo

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

En el segundo ejemplo, es necesario agregar datos de publicación adicionales en los mismos archivos dict. Incluso si no es un dict:

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

La solución:

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 feb. 2018 a las 14:56

Asegúrese de que la carga útil esté formateada correctamente. Parece que te falta un '{' en tu segundo objeto dentro de tu carga útil.

El código de respuesta de error del cliente de tipo de medio HTTP 415 no compatible indica que el servidor se niega a aceptar la solicitud porque el formato de carga está en un formato no compatible.

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

1
ehh123 27 feb. 2018 a las 13:07

Debe ponerlo como archivo (no como datos).

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

Funciona bien.

1
bugov 27 feb. 2018 a las 13:08