web-dev-qa-db-fra.com

Python Request Post avec données param

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.

111
slysid

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)
207
Martijn Pieters

Définissez les données sur ceci:

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

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
  • status_code devrait juste reconfirmer le code qui vous a été donné auparavant, bien sûr
5
Noel Evans