2013-04-09 88 views
59

這是API調用的原始請求:與PARAM數據的Python請求POST

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響應。

回答

128

params是GET風格的URL參數,data是POST風格的正文信息。在請求中提供這兩種類型的信息是完全合法的,並且您的請求也這樣做,但您已將URL參數編碼到URL中。

您的原始帖子包含JSON數據雖然,你最好使用json模塊正確編碼:

import json 

data = {"eventType": "AAS_PORTAL_START", "data": {"uid": "hfe3hf45huf33545", "aid": "1", "vid": "1"}} 
data = json.dumps(data) 

你可以打出URL參數太多:

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

然後張貼這與:

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) 

如果您使用0123.版本2.4.2或更高版本,則可以讓庫爲您執行JSON編碼;它也會設置正確的Content-Header;所有你需要做的是通過在Python對象編碼爲JSON到json關鍵字參數:

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) 
+1

我錯過的重要一點是數據和參數之間的差異。感謝您的澄清。下面是medata = json.dumps({「eventType」:「AAS_PORTAL_START」,「data」:{「uid」:「hfe3hf45huf33545」,「aid」:「1」,「vid」:「1」}})頭= {'content-type':'application/json'},resp = requests.post(url,data = data,headers = headers) – slysid 2013-04-09 13:13:32

+1

@MartijnPieters'data = json.dumps(data)'似乎沒有工作。而是像原始數據一樣以'data = data'的形式提供原始格式! – 2017-03-01 03:29:43

+0

@UmangSardesai:那麼'data'已經*編碼到JSON的其他地方了。然而,*似乎並沒有工作*沒有告訴我有關您的實際數據,您的預期或發生了什麼。如果您將原始Python字典傳遞給'data'參數,它將被編碼爲'application/x-www-form-urlencoded'數據,而不是* JSON *。 – 2017-03-01 09:16:35

4

將響應分配給一個值並測試它的屬性。這些應該告訴你有用的東西。

response = requests.post(url,params=data,headers=headers) 
response.status_code 
response.text 
  • STATUS_CODE應該只是再次確認與您之前給出的代碼,當然
+0

我想,之前和它說請求ID語法不正確。 – slysid 2013-04-09 12:21:33

8

組數據是:

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