Python demandes module: encodage des données json
Je suis en train de travailler sur une API wrapper. La spécification je suis en train de construire a la demande suivante:
curl -H "Content-type:application/json" -X POST -d data='{"name":"Partner13", "email":"[email protected]"}' http://localhost:5000/
Cette demande génère la réponse suivante à partir d'un petit serveur de test, j'ai installé pour voir exatly ce que les en-têtes/params etc sont envoyés comme. Ce petit script produit:
uri: http://localhost:5000/,
method: POST,
api_key: None,
content_type: application/json,
params: None,
data: data={"name":"Partner13", "email":"[email protected]"}
De sorte que ci-dessus est le résultat que je veux que mon script python pour créer quand il frappe le petit script de test.
Je suis en utilisant le python demandes de module, qui est la plus belle HTTP lib que j'ai jamais utilisé. Donc voici mon code python:
uri = "http://localhost:5000/"
headers = {'content-type': 'application/json' }
params = {}
data = {"name":"Partner13", "email":"[email protected]"}
params["data"] = json.dumps(data)
r = requests.post(uri, data=params, headers=headers)
Donc assez simple de trucs. Définir les en-têtes, et de créer un dictionnaire pour les paramètres POST. Ce dictionnaire a une entrée appelée "data" qui est la chaîne JSON des données que je veux envoyer au serveur. Ensuite, j'appelle la poste. Cependant, le résultat de mon petit script de test donne de l'est:
uri: http://localhost:5000/,
method: POST,
api_key: None,
content_type: application/json,
params: None,
data: data=%7B%22name%22%3A+%22Partner13%22%2C+%22email%22%3A+%22example%40example.com%22%7D
Donc, essentiellement, les données json que je voulais l'envoyer sous le paramètre de données a été urlendcoded.
Personne ne sait comment résoudre ce problème? J'ai regardé à travers les demandes de documentation et n'arrive pas à trouver un moyen de ne pas automatique urlencode l'envoi de données.
Merci beaucoup
Kevin
OriginalL'auteur kevin | 2013-04-01
Vous devez vous connecter pour publier un commentaire.
Lors de la création de l'objet pour le mot-clé data, il suffit d'assigner une variable le résultat de json.décharges(de données).
Aussi, parce HTTP POST peut accepter à la fois les paramètres d'url ainsi que les données dans le corps de la demande, et parce que la demande.post est la fonction d'un argument mot-clé nommé "params", il pourrait être préférable d'utiliser un autre nom de variable pour des raisons de lisibilité. Les demandes de docs utilisation de la variable nom de "charge utile", donc c'est ce que j'utilise.
OriginalL'auteur John_GG
Automatiquement les demandes URL encode les dictionnaires passé en tant que données ici. John_GG la solution fonctionne parce que plutôt que de poster un dictionnaire contenant la chaîne encodée JSON dans le champ "data", il passe simplement la chaîne encodée JSON directement: les chaînes de caractères ne sont pas automatiquement codé. Je ne peux pas dire que je comprends la raison de ce comportement de la Demande, mais peu importe, c'est ce qu'il est. Il n'existe aucun moyen pour activer ou désactiver ce comportement hors que je peux trouver.
Meilleur de la chance avec elle, Kevin.
En fait ce qui est utilisé pour coder un corps de requête. La pile d'appel est quelque chose comme
Request.init()
-->PreparedRequest.prepare()
-->PreparedRequest.prepare_body()
-->RequestEncodingMixin._encode_params()
. Cela semble être de traiter les demandes avecapplication/x-www-form-urlencoded
automatiquement le contenu.OriginalL'auteur minuteman3