Mit Python-Requests zu senden, Datei-und JSON in eine einzige Anfrage

Ich versuche, die POST an eine API (Bauen mit SlimPHP) akzeptiert ein Bild zusammen mit zusätzlichen Bild-meta-Daten in form von JSON.

Habe ich überprüft, die die API korrekt funktioniert mit einem REST-client-tool und erfolgreich buchen können auf den service. Alle Daten werden korrekt gespeichert.

Ich bin jetzt versucht zu POSTEN mit Python - aber mein JSON-Daten nicht angezeigt werden, speichern.

Mein code:

    data = {'key1': 'value1', 'key2': 'value2'}
    url = 'http://mydomain.com/api/endpoint'
    headers = {'Authorization': 'my-api-key'}
    files = {'file': (FILE, open(PATH, 'rb'), 'image/jpg', {'Expires': '0'})}
    r = requests.post(url, files=files, headers=headers, data=data)

--

Habe ich versucht, zusätzliche Header,

ie:/

headers = {'Authorization': 'unique-auth-key', 'Content-type': 'multipart/form-data'}

oder

headers = {'Authorization': 'unique-auth-key', 'Content-type': 'application/json'}

Diese führen im Ergebnis zu einem 500 error.


UPDATE 14/07/2014:

Mit einer chrome-extension (Advanced Rest Client) mein POST ist erfolgreich - hier ist was zeigt die Konsole als payload:

------WebKitFormBoundarysBpiwrA3hnGPUbMA
Content-Disposition: form-data; name="data"
test
------WebKitFormBoundarysBpiwrA3hnGPUbMA
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg
------WebKitFormBoundarysBpiwrA3hnGPUbMA--

Ich bin mir nicht ganz sicher, was dies bedeutet...

  • Sie müssen API-Spezifikation für den Aufruf ausgeführt. Ein Beispiel für die Verwendung curl, HTTPie oder similir tool würde helfen. In der Regel werden die JSON-Daten gesendet werden, im Körper als der einzige Inhalt. Wenn Sie möchten, kombinieren Sie es mit Datei-upload, sind Sie wahrscheinlich zu verwenden, Art form, mit einer Datei, die Bild und ein text-Feld mit der JSON. Jedenfalls data ist eine Zeichenfolge, die Sie ein Wörterbuch. Ändern Sie es zu data=json.dumps(data) helfen könnte.
  • Diese cURL Anfrage funktioniert: curl-i -F data='{"key": "value", "key": "value", "key": "value"}' -F name=image.jpg -F [email protected] -H 'Authorization: abcd-efgh-ijkl-mnop" my-url.com/api/endpoint
InformationsquelleAutor Simon | 2014-07-08
Schreibe einen Kommentar