2011-08-19 162 views
3

我想發送一個POST請求到一個restful webservice。我需要通過一些json在request.It的工作原理與curl命令如下從python發送POST請求到webservice

curl --basic -i --data '<json data string here>' -H Content-type:"text/plain" -X POST http://www.test.com/api 

我需要做在Python上述要求一些幫助。要發送蟒蛇這個POST請求我有下面的代碼至今:

import urllib 
url='http://www.test.com/api' 
params = urllib.urlencode... #What should be here ? 
data = urllib.urlopen(url, params).read() 

我有以下三個問題:

  1. 這是送resuest的正確方法?
  2. 我應該如何指定參數值?
  3. 是否需要指定內容類型?

請幫助 謝謝

回答

1
  1. 構建你要發送的POST請求的數據的dict
  2. urlencode字典得到一個字符串。
  3. urlopen您需要的URL,將可選的data參數傳遞爲您編碼的POST數據。
+0

感謝您的答覆。我有數據字典。你能舉個下一步的例子,例如urlencode嗎? – Joe

+0

@Joe:你調用函數'urlencode'並將它的數據字典作爲參數傳遞給它!它能有多難? – katrielalex

+0

@Joe:'urlencode(my_data)' – katrielalex

2

httplib的文檔有發送POST請求的example

>>> import httplib, urllib 
>>> params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'}) 
>>> headers = {"Content-type": "application/x-www-form-urlencoded", 
...   "Accept": "text/plain"} 
>>> conn = httplib.HTTPConnection("bugs.python.org") 
>>> conn.request("POST", "", params, headers) 
>>> response = conn.getresponse() 
>>> print response.status, response.reason 
302 Found 
>>> data = response.read() 
>>> data 
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>' 
>>> conn.close() 
1

與發送的參數爲「JSON」的問題涉及.. 您需要設置內容類型應用在頁眉/ JSON,然後發送paramters沒有URL編碼..

前:

url = "someUrl" 

data = { "data":"ur data"} 


header = {"Content-Type":"application/json","User-Agent":"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"} 

#lets use httplib2 

import httplib2 
http = httplib2.Http() 

response, send = http.request(url,"POST",headers=header,body=data) 
1

你不需要urllib.urlencode()如果Content-Type沒有application/x-www-form-urlencoded

import json, urllib2 

data = {"some": "json", "d": ["a", "ta"]} 
req = urllib2.Request("http://www.test.com/api", data=json.dumps(data), 
         headers={"Content-Type": "application/json"}) 
print urllib2.urlopen(req).read() 
-1

以下是關於json POST請求的示例代碼片段。結果將打印在您的終端中。

import urllib, urllib2 

url = 'http://www.test.com/api' 
values = dict(data=json.dumps({"jsonkey2": "jsonvalue2", "jsonkey2": "jsonvalue2"})) 
data = urllib.urlencode(values) 
req = urllib2.Request(url, data) 
rsp = urllib2.urlopen(req) 
content = rsp.read() 

print content 
+0

解釋你做了什麼 – CodeGodie