Python Request Post mit Parameterdaten

150

Dies ist die unformatierte Anforderung für einen API-Aufruf:

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"}}"""

Diese Anforderung gibt eine erfolgreiche Antwort (2xx) zurück.

Jetzt versuche ich diese Anfrage zu posten mit 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]>

Für mich sieht alles gut aus und ich bin mir nicht ganz sicher, was ich falsch poste, um eine Antwort von 400 zu erhalten.

Slysid
quelle

Antworten:

260

paramsist für URL-Parameter im GET-Stil, dataist für Körperinformationen im POST-Stil. Es ist völlig legal, beide Arten von Informationen in einer Anfrage anzugeben, und Ihre Anfrage auch, aber Sie haben die URL-Parameter bereits in die URL codiert.

Ihr Rohbeitrag enthält jedoch JSON- Daten. requestskann die JSON-Codierung für Sie verarbeiten und stellt auch die richtige Einstellung ein Content-Header; Sie müssen lediglich das Python-Objekt, das als JSON codiert werden soll, an das jsonSchlüsselwortargument übergeben.

Sie können auch die URL-Parameter aufteilen:

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

Dann poste deine Daten mit:

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)

Das jsonSchlüsselwort ist neu in requestsVersion 2.4.2; Wenn Sie immer noch eine ältere Version verwenden müssen, codieren Sie den JSON manuell mithilfe des jsonModuls und geben Sie das codierte Ergebnis als dataSchlüssel ein. In diesem Fall müssen Sie den Content-Type-Header explizit festlegen:

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
quelle
12

Stellen Sie die Daten auf Folgendes ein:

data ={"eventType":"AAS_PORTAL_START","data":{"uid":"hfe3hf45huf33545","aid":"1","vid":"1"}}
Ionut Hulub
quelle
5
Erklären Sie kurz, was Sie anders gemacht haben als seine Daten
Ayyan Khan
8

Weisen Sie die Antwort einem Wert zu und testen Sie die Attribute. Diese sollten Ihnen etwas Nützliches sagen.

response = requests.post(url,params=data,headers=headers)
response.status_code
response.text
  • status_code sollte natürlich nur den Code bestätigen, den Sie zuvor erhalten haben
Noel Evans
quelle
Ich habe das schon einmal versucht und es heißt, die Anforderungs-ID sei syntaktisch falsch.
Slysid