Повідомлення запиту Python з даними парам


150

Це необроблений запит для виклику 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"}}"""

Цей запит повертає успішну (2xx) відповідь.

Зараз я намагаюся опублікувати цей запит, використовуючи 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]>

Для мене все виглядає нормально, і я не зовсім впевнений, що я неправильно розміщую повідомлення, щоб отримати відповідь 400.

Відповіді:


262

paramsпризначений для параметрів URL-стилю GET, dataпризначений для інформації про тіло у стилі POST. Цілком законно надавати обидва типи інформації у запиті, і ваш запит також робить це, але ви вже закодували параметри URL-адреси в URL-адресу.

Незважаючи на те, що ваша сировина містить дані JSON requestsможе обробляти кодування JSON для вас, і воно також встановить правильне Content-Header; все, що вам потрібно зробити, це передати об’єкт Python, який потрібно закодувати як JSON в jsonаргумент ключового слова.

Ви також можете розділити параметри URL-адреси:

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

потім опублікуйте свої дані за допомогою:

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)

jsonКлючове слово нового в requestsверсії 2.4.2; якщо вам все-таки доведеться використовувати старішу версію, кодуйте JSON вручну за допомогою jsonмодуля та розмістіть кодований результат як dataключ; у цьому випадку вам доведеться чітко встановити заголовок типу "Вміст":

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)

12

Встановіть дані для цього:

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

5
НЕ коротко поясніть, що ви зробили інакше, ніж його дані
Айян Хан

8

Призначте відповідь до значення та протестуйте його атрибути. Вони повинні розповісти вам щось корисне.

response = requests.post(url,params=data,headers=headers)
response.status_code
response.text
  • Status_code, звичайно, повинен лише підтвердити код, який вам було надано раніше

Я раніше це намагався, і він говорить, що ідентифікатор запиту синтаксично неправильний.
slysid
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.