2016-05-10 3 views
0

Ich versuche Postdaten an eine API zu senden, die in JSON sein muss. Wenn der Requests-Header Content-type: application-json nicht hat, schlägt die Anfrage fehl und ich bekomme eine HTTPError: 415 Client Error: Unsupported Media Type for urlUmgang mit Dezimal zu Json in Anfragen-Bibliothek

Allerdings scheint nur Anfragen in diesem Header hinzuzufügen, wenn ich den integrierten JSON-Parser verwende. Auch wenn die Dokumente, die unten vorzuschlagen scheinen entspricht:

>>> r = requests.post(url, data=json.dumps(payload)) 

>>> r = requests.post(url, json=payload) 

Was bedeutet, dass ich den eingebauten json-Parser (die Content-Type-Header oder manuell hinzufügen) verwenden müssen.

jedoch meine Post-Daten mehr Dezimal Felder haben (von api über json.loads(response.text, parse_float=decimal.Decimal) umgewandelt in einem django DecimalField gespeichert werden), die, wenn die eingebauten Anfragen Parser geben den Fehler:

TypeError: Decimal('1560.35') is not JSON serialisable 

Gibt es eine Möglichkeit, ich kann Verwenden Sie einen anderen JSON-Parser mit Anfragen (zB simplejson, der sich mit Dezimalzahlen beschäftigt) und lassen Sie den Inhaltstyp noch angeben.

+0

"die Dokumente scheinen zu empfehlen": Wo? –

+0

Kannst du es nicht als String speichern? – Kavli

Antwort

1

Ich weiß nicht, wie Sie einen anderen JSON-Parser verwenden, aber Sie können den Header (und damit den Inhaltstyp) festlegen.

r = requests.post(url, data=json.dumps(payload), headers={'Content-type': 'application/json'}) 
# or with a session object 
s = requests.Session() 
s.headers['Content-Type'] = 'application/json' 
s.post(url, data=json.dumps(payload)) 
+0

danke das funktioniert (wenn ich es schaffe, einen Tippfehler in den Header (!) Zu legen. Zusammen mit http://stackoverflow.com/questions/16957275/python-to-json-serialization-fails-on-decimal – Yunti

1

Dezimalzahlen können serialisiert werden, indem sie eine benutzerdefinierte Funktion durchlaufen.

def decimal_default(obj): 
    if isinstance(obj, Decimal): 
     return str(obj) 
    raise TypeError 


data = json.dumps(payload, default=decimal_default) 

response = requests.post(
    url=url, 
    data=data, 
    headers={ 
     'Content-type': 'application/json', 
    } 
)