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. Jedenfallsdata
ist eine Zeichenfolge, die Sie ein Wörterbuch. Ändern Sie es zudata=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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist, dass Sie mit den Bild-Metadaten als Quelle von Schlüssel/Wert-Paaren gebucht werden. Anstatt Sie als den Wert eines dieser Schlüssel/Wert-Paaren.
Dem folgenden code wird eine Anfrage senden viel wie der curl-Anweisung, die Sie zur Verfügung gestellt: