Mi sono imbattuto in questo problema quando giocavo con un'API esterna. Inviavo i miei dati del corpo come un dizionario dritto nella richiesta e stavo 400 errori:Perché il corpo della richiesta POST HTTP deve essere JSON enconded in Python?
data = {
"someParamRange": {
"to": 1000,
"from": 100
},
"anotherParamRange": {
"to": True,
"from": False
}
}
Quando ho aggiunto un involucro json.dumps, funziona:
data = json.dumps({
"someParamRange": {
"to": 1000,
"from": 100
},
"anotherParamRange": {
"to": True,
"from": False
}
})
che faccio non del tutto capire perché questo è necessario, poiché i dizionari e gli oggetti JSON sono sintatticamente identici. Qualcuno può aiutarmi a capire cosa sta succedendo dietro le quinte qui?
Per completezza, ecco le mie intestazioni:
headers = {'API-KEY': 'blerg', 'Accept-Encoding': 'UTF-8', 'Content-Type': 'application/json', 'Accept': '*/*', 'username': 'user', 'password': 'pwd'}
EDIT:
non ho menzionato questo prima, ma ora sento che potrebbe essere rilevante. Sto usando la libreria Python Requests e un altro post sembra suggerire che non dovresti mai codificare i parametri su un oggetto request: https://stackoverflow.com/a/14804320/1012040
"Indipendentemente dal fatto che GET/POST non devi mai ricodificare i parametri, basta semplicemente un dizionario come argomento ed è bello andare. "
Sembra che la serializzazione non sia necessaria?
La mia richiesta oggetto:
response = requests.post(url, data=data, headers=headers)
dovresti postare il resto del tuo codice. Potrei creare un http api in cui entrambi funzionerebbero in modo equivalente. – cwa
non è un'API pubblica, o/w Vorrei :(Stai dicendo che questa potrebbe essere solo una funzione dell'API specifica rispetto a qualcosa di generale alle richieste HTTP? – acpigeon
Ti suggerisco di leggere la serializzazione degli oggetti. 'Json.dump 'serializza l'oggetto in modo che possa essere inviato come flusso di dati, in sostanza. L'inserimento dell'oggetto direttamente invierà attraverso un flusso binario di dati che il server non saprà come decodificare. – PhD