261 votes

Python Request Post avec données param

Il s'agit de la demande brute pour un appel d'API :

POST http://192.168.3.45:8080/api/v2/event/log?sessionKey=b299d17b896417a7b18f46544d40adb734240cc2&format=json HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 86
Host: 192.168.3.45:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

{"eventType":"AAS_PORTAL_START","data":{"uid":"hfe3hf45huf33545","aid":"1","vid":"1"}}"""

Cette demande renvoie une réponse positive (2xx).

J'essaie maintenant de poster cette demande en utilisant requests :

>>> import requests
>>> headers = {'content-type' : 'application/json'}
>>> data ={"eventType":"AAS_PORTAL_START","data{"uid":"hfe3hf45huf33545","aid":"1","vid":"1"}}
>>> url = "http://192.168.3.45:8080/api/v2/event/log?sessionKey=9ebbd0b25760557393a43064a92bae539d962103&format=xml&platformId=1"
>>> requests.post(url,params=data,headers=headers)
<Response [400]>

Tout me semble correct et je ne sais pas vraiment ce que j'ai fait de mal pour obtenir une réponse 400.

434voto

Martijn Pieters Points 271458

params est pour les paramètres d'URL de type GET, data est pour les informations du corps de style POST. Il est parfaitement légal de fournir les deux et votre demande le fait aussi, mais vous avez déjà encodé les paramètres de l'URL dans l'URL.

Votre message brut contient JSON données cependant. requests peut gérer l'encodage JSON pour vous, et il définira le bon paramètre Content-Type Tout ce que vous avez à faire est de passer l'objet Python à encoder en JSON dans l'en-tête json l'argument du mot-clé.

Vous pourriez également séparer les paramètres de l'URL :

params = {'sessionKey': '9ebbd0b25760557393a43064a92bae539d962103', 'format': 'xml', 'platformId': 1}

puis postez vos données avec :

import requests

url = 'http://192.168.3.45:8080/api/v2/event/log'

data = {"eventType": "AAS_PORTAL_START", "data": {"uid": "hfe3hf45huf33545", "aid": "1", "vid": "1"}}
params = {'sessionKey': '9ebbd0b25760557393a43064a92bae539d962103', 'format': 'xml', 'platformId': 1}

requests.post(url, params=params, json=data)

El json Le mot-clé est nouveau dans requests version 2.4.2 ; si vous devez quand même utiliser une version plus ancienne, encodez le JSON manuellement à l'aide de la fonction json et de poster le résultat encodé en tant que data vous devrez définir explicitement l'en-tête Content-Type dans ce cas :

import requests
import json

headers = {'content-type': 'application/json'}
url = 'http://192.168.3.45:8080/api/v2/event/log'

data = {"eventType": "AAS_PORTAL_START", "data": {"uid": "hfe3hf45huf33545", "aid": "1", "vid": "1"}}
params = {'sessionKey': '9ebbd0b25760557393a43064a92bae539d962103', 'format': 'xml', 'platformId': 1}

requests.post(url, params=params, data=json.dumps(data), headers=headers)

14voto

Noel Evans Points 939

Attribuez la réponse à une valeur et testez les attributs de celle-ci. Ceux-ci devraient vous indiquer quelque chose d'utile.

response = requests.post(url,params=data,headers=headers)
response.status_code
response.text
  • status_code devrait juste reconfirmer le code qui vous a été donné auparavant, bien sûr.

9voto

Ionut Hulub Points 5543

Définissez les données comme ceci :

data ={"eventType":"AAS_PORTAL_START","data":{"uid":"hfe3hf45huf33545","aid":"1","vid":"1"}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X