Post de demande Python avec données param

150

Ceci est 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 de succès (2xx).

J'essaye 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 va bien et je ne suis pas tout à fait sûr de ce que je poste de mal pour obtenir une réponse 400.

slysid
la source

Réponses:

262

paramsest pour les paramètres d'URL de style GET, dataest pour les informations de corps de style POST. Il est parfaitement légal de fournir les deux types d'informations dans une requête, et votre requête le fait également, mais vous avez déjà encodé les paramètres d'URL dans l'URL.

Votre publication brute contient cependant des données JSON . requestspeut gérer l'encodage JSON pour vous, et il définira également le bon Content-Header; tout ce que vous avez à faire est de passer l'objet Python à encoder en JSON dans l' jsonargument mot - clé.

Vous pouvez également diviser les paramètres d'URL:

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

puis publiez 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 jsonmot-clé est nouveau dans la requestsversion 2.4.2; si vous devez toujours utiliser une version plus ancienne, encodez le JSON manuellement à l'aide du jsonmodule et publiez le résultat encodé comme dataclé; 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)
Martijn Pieters
la source
12

Définissez les données sur ceci:

data ={"eventType":"AAS_PORTAL_START","data":{"uid":"hfe3hf45huf33545","aid":"1","vid":"1"}}
Ionut Hulub
la source
5
Expliquez brièvement ce que vous avez fait différemment de ses données
Ayyan Khan
8

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 simplement reconfirmer le code qui vous a été donné auparavant, bien sûr
Noel Evans
la source
J'ai essayé cela avant et il est indiqué que l'ID de la demande est syntaxiquement incorrect.
slysid