2010-08-26 73 views
3

我有一個REST服務,我試圖調用。它需要類似於以下語法的東西:使用Python調用REST服務

http://someServerName:8080/projectName/service/serviceName/ 
     param1Name/param1/param2Name/param2 

我必須使用POST連接到它。我試着在上面閱讀在線(herehere,例如)......但是這是我的問題:

如果我嘗試使用HTTP GET請求的方法,通過建立自己的路,像這樣:

BASE_PATH = "http://someServerName:8080/projectName/service/serviceName/" 
urllib.urlopen(BASE_PATH + "param1/" + param1 + "/param2/" + param2) 

它給了我一個錯誤,說GET不被允許。

如果我嘗試使用HTTP POST請求的方法,像這樣:

params = { "param1" : param1, "param2" : param2 } 
urllib.urlopen(BASE_PATH, urllib.urlencode(params)) 

它與消息The requested resource() is not available.一併返回404錯誤當我調試這個,它似乎是建立PARAMS進入查詢字符串(「param1 = whatever & param2 = whatever」...)

如何使用POST,但傳遞由斜線分隔的參數,如預期的那樣?我究竟做錯了什麼?

回答

5

我知道這是不公平的,但這是最終發生的事情......負責REST服務的程序員將其更改爲使用&key=value語法。

2
  1. 使用urllib2
  2. 你將必須聰明;像

    params = { "param1" : param1, "param2" : param2 }

    urllib2.urlopen(BASE_PATH + "?" + urllib.urlencode(params), " ")

    可能會奏效。

+0

+1:您必須提供數據以強制它成爲POST請求。 – 2010-08-26 20:08:38

+1

我爲什麼要使用urllib2?爲什麼問號? – froadie 2010-08-26 20:18:08

0

像這樣的東西可能會奏效:

param1, param2 = urllib.quote_plus(param1), urllib.quote_plus(param2) 
BASE_PATH = "http://someServerName:8080/projectName/service/serviceName/" 
urllib.urlopen(BASE_PATH + "param1/" + param1 + "/param2/" + param2, " ") 

的第二個參數urlopen告訴它做一個POST請求,數據爲空。 quote_plus允許您轉義特殊字符而不被強制轉換爲&key=value方案。

+0

這似乎不工作... :(我得到相同的「請求的資源不可用」的錯誤,如以前 – froadie 2010-08-26 20:16:04

+0

你確定你能夠訪問資源嗎?你需要先認證自己嗎?你能給我們的網址,所以我們可以測試? – JiminyCricket 2010-08-26 21:32:10