J'essaie d'envoyer un tableau (liste) de demandes à l'API WheniWork à l'aide de requests.post, et j'obtiens l'une des deux erreurs suivantes. Lorsque j'envoie la liste sous forme de liste, j'obtiens une erreur de décompression et lorsque je l'envoie sous forme de chaîne, un message d'erreur me demande de soumettre un tableau. Je pense que cela a quelque chose à voir avec la façon dont les demandes gèrent les listes. Voici les exemples:
url='https://api.wheniwork.com/2/batch'
headers={"W-Token": "Ilovemyboss"}
data=[{'url': '/rest/shifts', 'params': {'user_id': 0,'other_stuff':'value'}, 'method':'post',{'url': '/rest/shifts', 'params': {'user_id': 1,'other_stuff':'value'}, 'method':'post'}]
r = requests.post(url, headers=headers,data=data)
print r.text
# ValueError: too many values to unpack
Enveloppant simplement la valeur des données entre guillemets:
url='https://api.wheniwork.com/2/batch'
headers={"W-Token": "Ilovemyboss"}
data="[]" #removed the data here to emphasize that the only change is the quotes
r = requests.post(url, headers=headers,data=data)
print r.text
#{"error":"Please include an array of requests to make.","code":5000}
Vous souhaitez transmettre des données codées JSON . Voir le documentation de l'API :
Rappelez-vous - Tous les corps de publication doivent être des données codées JSON (pas de données de formulaire).
La bibliothèque requests
simplifie ceci de manière triviale:
headers = {"W-Token": "Ilovemyboss"}
data = [
{
'url': '/rest/shifts',
'params': {'user_id': 0, 'other_stuff': 'value'},
'method': 'post',
},
{
'url': '/rest/shifts',
'params': {'user_id': 1,'other_stuff': 'value'},
'method':'post',
},
]
requests.post(url, json=data, headers=headers)
En utilisant l'argument de mot clé json
, les données sont codées au format JSON pour vous et le paramètre Content-Type
en-tête est défini sur application/json
.
Eh bien, tout ce que j'avais à faire, c'était d'ajouter ces en-têtes:
headers = {'Content-Type': 'application/json', 'Accept':'application/json'}
puis appelez les demandes
requests.post(url,data=json.dumps(payload), headers=headers)
et maintenant je vais bien!
Rappelez-vous toujours lors de l'envoi d'un tableau (liste) ou dictionnaire dans le HTTP POST = demande, utilisez l'argument json dans la fonction post et définissez sa valeur sur votre tableau (liste)/dictionnaire .
Dans votre cas ce sera comme:
r = requests.post (url, en-têtes = en-têtes, json = données)
Remarque: Les demandes POST convertissent implicitement le type de contenu du paramètre pour body en application/json.
Pour une introduction rapide, lisez API-Integration-In-Python