Voici 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 réussie (2xx).
Maintenant j'essaye 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 bien et je ne suis pas tout à fait sûr de ce que je poste mal pour obtenir une réponse de 400.
params
est pour les paramètres d'URL de style GET, data
est pour les informations de corps de style POST. Il est parfaitement légal de fournir les deux types d'informations dans une demande, 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 également le Content-Header
correct; tout ce que vous avez à faire est de passer l'objet Python à encoder en tant que JSON dans l'argument de mot clé json
.
Vous pouvez également séparer les paramètres d'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)
Le mot clé json
est nouveau dans requests
version 2.4.2; si vous devez toujours utiliser une version plus ancienne, codez le JSON manuellement à l'aide du module json
et publiez le résultat codé sous la forme de la clé 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)
Définissez les données sur ceci:
data ={"eventType":"AAS_PORTAL_START","data":{"uid":"hfe3hf45huf33545","aid":"1","vid":"1"}}
Attribuez la réponse à une valeur et testez ses attributs. Ceux-ci devraient vous dire quelque chose d'utile.
response = requests.post(url,params=data,headers=headers)
response.status_code
response.text