web-dev-qa-db-fra.com

Comment envoyer un tableau en utilisant requests.post (Python)? "Erreur de valeur: trop de valeurs à décompresser"

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}
41
Bobby Battista

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.

64
Martijn Pieters

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!

14
elad silver

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

3
MHBN