Python Request Post với dữ liệu param


150

Đây là yêu cầu thô cho một lệnh gọi 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"}}"""

Yêu cầu này trả về phản hồi (2xx) thành công.

Bây giờ tôi đang cố gắng gửi yêu cầu này bằng cách sử dụng 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]>

Mọi thứ có vẻ ổn với tôi và tôi không chắc chắn những gì tôi đăng sai để nhận được 400 phản hồi.

Câu trả lời:


260

paramsdành cho các tham số URL kiểu GET, datadành cho thông tin cơ thể kiểu POST. Việc cung cấp cả hai loại thông tin trong một yêu cầu là hoàn toàn hợp pháp và yêu cầu của bạn cũng vậy, nhưng bạn đã mã hóa các tham số URL vào URL rồi.

Bài viết thô của bạn chứa dữ liệu JSON mặc dù. requestscó thể xử lý mã hóa JSON cho bạn và nó cũng sẽ đặt chính xác Content-Header; tất cả những gì bạn cần làm là chuyển vào đối tượng Python để được mã hóa dưới dạng JSON vào jsonđối số từ khóa.

Bạn cũng có thể tách ra các tham số URL:

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

sau đó đăng dữ liệu của bạn với:

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)

Các jsontừ khóa mới trong requestsphiên bản 2.4.2; nếu bạn vẫn phải sử dụng phiên bản cũ hơn, hãy mã hóa JSON theo cách thủ công bằng cách sử dụng jsonmô-đun và đăng kết quả được mã hóa làm datakhóa; bạn sẽ phải đặt tiêu đề Kiểu nội dung một cách rõ ràng trong trường hợp đó:

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

Đặt dữ liệu này:

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

5
NÊN giải thích ngắn gọn những gì bạn đã làm khác với dữ liệu của anh ấy
Ayyan Khan

8

Chỉ định phản hồi cho một giá trị và kiểm tra các thuộc tính của nó. Những thứ này sẽ cho bạn biết một cái gì đó hữu ích.

response = requests.post(url,params=data,headers=headers)
response.status_code
response.text
  • status_code chỉ nên xác nhận lại mã bạn đã được cung cấp trước đó, tất nhiên

Tôi đã thử điều đó trước đây và nó nói id yêu cầu về mặt cú pháp không chính xác.
slysid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.