Python Request Post dengan data param

150

Ini adalah permintaan mentah untuk panggilan 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"}}"""

Permintaan ini mengembalikan respons sukses (2xx).

Sekarang saya mencoba mengirim permintaan ini menggunakan 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]>

Semuanya terlihat baik bagi saya dan saya tidak yakin apa yang saya posting salah untuk mendapatkan 400 tanggapan.

licik
sumber

Jawaban:

262

paramsadalah untuk parameter URL gaya GET, datauntuk informasi badan gaya POST. Adalah sah untuk memberikan kedua jenis informasi dalam permintaan, dan permintaan Anda juga melakukannya, tetapi Anda telah menyandikan parameter URL ke dalam URL.

Posting mentah Anda mengandung data JSON . requestsdapat menangani pengkodean JSON untuk Anda, dan itu akan mengatur yang benar Content-Headerjuga; yang perlu Anda lakukan adalah memasukkan objek Python untuk dikodekan sebagai JSON ke dalam jsonargumen kata kunci.

Anda dapat membagi parameter URL juga:

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

kemudian kirimkan data Anda dengan:

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)

Kata jsonkunci tersebut baru dalam requestsversi 2.4.2; jika Anda masih harus menggunakan versi yang lebih lama, enkode JSON secara manual menggunakan jsonmodul dan posting hasil yang disandikan sebagai datakunci; Anda harus mengatur tajuk Tipe Konten secara eksplisit dalam kasus itu:

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

Tetapkan data untuk ini:

data ={"eventType":"AAS_PORTAL_START","data":{"uid":"hfe3hf45huf33545","aid":"1","vid":"1"}}
Ionut Hulub
sumber
5
Jelaskan secara singkat apa yang telah Anda lakukan secara berbeda dari datanya
Ayyan Khan
8

Tetapkan respons terhadap nilai dan uji atributnya. Ini akan memberi tahu Anda sesuatu yang bermanfaat.

response = requests.post(url,params=data,headers=headers)
response.status_code
response.text
  • status_code seharusnya mengkonfirmasi ulang kode yang Anda berikan sebelumnya, tentu saja
Noel Evans
sumber
Saya sudah mencobanya sebelumnya dan katanya meminta id secara sintaksis salah.
slysid