Python中SOAP項目的介紹及其在web開發中的應用

來源:互聯網
上載者:User
SOAP.py 客戶機和伺服器

SOAP.py 包含的是一些基本的東西。沒有 Web 服務描述語言(Web Services Description Language,WSDL)或者任何其它附加的東西,只有用 Python 實現的 SOAP 客戶機和伺服器的透明支援。甚至這個包中的一個很好的功能也只是與基礎架構相關:SOAP.py 支援安全通訊端層(SSL)用於加密的 SOAP 傳輸。為使用這個功能,您必須安裝 M2Crypto,M2Crypto 是一個庫,包含各種加密工具和格式,從 RSA 和 DSA 到 HTTPs、S/MIME 等等。在這一部分,我們不準備討論 SOAP.py 的 SSL 支援。
SOAP 動作摘要

目前為止,SOAP 公用程式好象仍是比較流行的使用 Python 的開放原始碼活動。下面是該項目的綱要以及它們目前的狀態。首先,參與者:

  • 4Suite SOAP,由 Fourthought 管理
  • SOAPy,由 Adam Elman 管理
  • SOAP.py,Python 項目的一個 Web 服務項目
  • soaplib,由 Secret Labs 管理
  • Orchard,由 Ken MacLeod 管理
  • PySOAP,由 Dave Warner 管理

4Suite SOAP 是我們自己的實現,我們在本專欄的前面三部分中使用過(請參閱 參考資料以獲得它的連結)。它目前仍在開發中。

SOAPy 是在 2001 年 4 月公布的,目前處於 alpha 的預備階段,但現在好象停止開發了。

SOAP.py 開發被凍結了。SOAP.py 這個項目是由 actzero 公司贊助的,而 actzero 卻不再從事這一行業了。正在邀請自願開發/維護 SOAP.py 的組織。

soaplib 的開發好象也延緩了,考慮到 Secret Labs 這段時間所承擔的大量工作,或許就可以理解為什麼會這樣了。這個瑞典的公司是由 Fredrik Lundh 掌管的,他在 Python 圈內是出名的“工作狂”,同時也是 Python Association 董事會的一名成員。Secret Labs 還開發 PythonWare(Python 的一個核心和重要的附加模組);PythonWorks(一個領先的 Python IDE);Python Imaging Library 和許多其它好東西(日常 Python-URL Web 日誌就是其中的一部分)。

Orchard 是一個資料管理架構,基本上是一種用一個公用介面管理不同資料格式的方法。它實現了一個 SOAP 客戶機作為在遠端程序呼叫中向 SOAP 伺服器發送 Orchard 資料項目的基本方法(被稱為節點)。

PySOAP 這個項目主要是想作為 Dave Warner 的 Church 管理套件的一部分,但它還從沒發行過任何檔案,好象是一個毫無生氣的項目。

安裝

開始先下載分發包(在寫這篇文章的時候,SOAPpy 0.9.7 是最新的分發包),把檔案解包,轉到結果目錄,並把檔案 SOAP.py複製到自己傾向的位置。當然,這個“傾向”就是需要技巧的地方。由於這些 SOAP lib 中有很多都使用大小寫組合不同的“soap.py”作為模組名,所以大家一定要小心。當然,UNIX 使用者只需關心大小寫是否精確匹配,但對於 Windows 使用者來說,甚至“SOAP.py”和“soap.py”之間的衝突也會帶來麻煩。Orchard 的 SOAP.py 也有一個容易發生衝突的名稱,但它有可能避開所有的問題,因為它的模組聰明地放在了 Orchard 包中。

上面的內容簡言之就是建議您確保安裝所有的 Python SOAP 模組時都使用與眾不同的包名稱。在我們的案例中,我們在 PYTHONPATH 中發現了一個合適的目錄並建立了一個 WebServices 包,把 SOAP.py 放在了這個包中。因此,在 Linux 中:

$ mkdir ~/lib/python/WebServices$ touch ~/lib/python/WebServices/__init__.py$ cp SOAPpy097/SOAP.py ~/lib/python/WebServices


請注意很重要的第二條命令,它將產生一個 __init__.py 檔案,這個檔案將 WebServices 目錄標誌為 Python 包。如果您需要把這些代碼打包成 Windows 版本,您可能希望向空檔案中輸入一些注釋,因為一些 Windows 工具不建立空檔案。

您已深入主題了

對於公開提供的 SOAP 伺服器,早已經有了好幾個活動的註冊中心。最流行的可能是 XMethods。當然,它也是一個相當有趣的指導,通過它我們可以瞭解 SOAP 的實際狀況,而不要聽它的吹噓。這裡的大多數公用 Web 服務仍然只是一些無關緊要的東西,幾乎不值得我們勇敢的新模型多費口舌,但那是另一回事了。實際上,我們將選擇一個公用服務來示範和測試如何把 SOAP.py 作為 SOAP 客戶機使用。

或者,我們可以試試。作者嘗試的第一個服務,衛生保健提供者定位器,在遇到下列報錯訊息時顯示 SOAP 互通性的目前狀態中的陷阱:

WebServices.SOAP.faultType: 


哦。SOAPAction 是一個 HTTP 頭,應該是用來標記被訪問服務的。它是 SOAP 請求中必需的頭,但即便是設定了所需的頭(只是一對空的雙引號)後,上面的錯誤仍然存在。作者發現大多數 MS SOAP 實現都存在這個問題。在試遍了這些服務後,我們斷定,Delphi 實現好象與 SOAP.py 合作得最好,但在試服務時 — 即使是用 Delphi 實現時,也返回複雜的類型,比如列表,SOAP.py 無法使用它們,返回不帶資料的 WebServices.SOAP.typedArrayType 執行個體。

最後,作者選擇了一個相當合適的 Web 服務,該服務返回漫畫《丁丁曆險記》中的人物 Haddock 船長常用的罵人語言(是的,大多數 Web 服務都是這樣)。 清單 1(curse.py)就是這個程式。

清單 1:訪問 Curse 產生器 SOAP 服務的 SOAP.py 程式

 #!/usr/bin/env python#http://xmethods.net/detail.html?id=175import sys#Import the SOAP.py machineryfrom WebServices import SOAPremote = SOAP.SOAPProxy("http://www.tankebolaget.se/scripts/Haddock.exe/soap/IHaddock", namespace="urn:HaddockIntf-IHaddock", soapaction="urn:HaddockIntf-IHaddock#Curse")try: lang = sys.argv[1]except IndexError: lang = "us"result = remote.Curse(LangCode=lang)print "What captain Haddock had to say: "%s""%result


把一切綜合在一起

匯入庫後,我們將設定代理對象 remote 。這個對象將方法調用轉換為遠程 SOAP 訊息。它的初始化器使用管理遠程請求的關鍵參數: 伺服器的 URI(被稱為“端點”)、請求元素的 XML 名稱空間(通過它,SOAP-as-RPC 將 口頭承諾變成 XML 基礎)和 SOAPAction 頭值。

接下來,我們將確定方法參數,對於這個 Web 服務來說,方法參數只是 Haddock 罵人的語言,瑞典語(“se”)或英語(奇怪的是,是“us”而不是“en”)。

最後,我們調用名稱正確的方法,代理對象的 Curse 進行 SOAP 調用,然後列印出結果。下面的會話示範了對該程式的使用:

$ python curse.pyWhat captain Haddock had to say: "Ectoplasmic Byproduct!"


我們自己的 SOAP 伺服器

用 SOAP.py 實現 SOAP 伺服器相當容易。作為一個樣本,我們將仿建欄位,還要實現一個很常見的服務:一個程式,給出年份和月份,它將以字串的形式列印出日曆。它的程式伺服器是 清單 2(calendar-ws.py)。

清單 2:實現日曆伺服器的 SOAP.py 程式

 #!/usr/bin/env pythonimport sys, calendar#Import the SOAP.py machineryfrom WebServices import SOAPCAL_NS = "http://uche.ogbuji.net/eg/ws/simple-cal"class Calendar: def getMonth(self, year, month):  return calendar.month(year, month) def getYear(self, year):  return calendar.calendar(year)server = SOAP.SOAPServer(("localhost", 8888))cal = Calendar()server.registerObject(cal, CAL_NS)print "Starting server..."server.serve_forever()


進行過必要的匯入後,我們為自己的伺服器定義 SOAP 請求元素期望的名稱空間( CAL_NS )。接下來我們定義實現所有方法的類,這些方法將被公開為 SOAP 方法。大家也可以把單個函數作為 SOAP 方法註冊,但使用類方法是最靈活的,特別是當您想管理調用間的狀態時。這個 Calendar 類定義了一個方法 getMonth ,該方法使用 Python 的內建日曆模組在文本表單中返回月度日曆,同時它還定義了另一個返回整年日曆的方法。

然後建立 SOAP 伺服器架構的一個執行個體,這個執行個體還帶有偵聽連接埠 8888 的指令。我們還必須建立 Calendar 類的一個執行個體,這個執行個體在下一行中被註冊用來處理 SOAP 訊息,同時為其指出相關的名稱空間。最後,我們調用 serve_forever 方法,該方法直到進程終止才返回。

為運行伺服器,請開啟另一個命令 shell 並執行 python calendar-ws.py 。執行結束時使用 ctrl-C 殺死進程。

我們本來可以用也是用 SOAP.py 寫的客戶機測試伺服器,但那太顯而易見了。我們還是用低級 Python 編寫客戶機把 SOAP 響應作為 XML 字串來構建,並發送一條 HTTP 訊息。這個程式(testcal.py)在 清單 3中。

清單 3:用 Python 核心庫寫的訪問日曆服務的客戶機

 import sys, httplibSERVER_ADDR = "127.0.0.1"SERVER_PORT = 8888CAL_NS = "http://uche.ogbuji.net/ws/eg/simple-cal"BODY_TEMPLATE = """      %s   %s   """def GetMonth():  year = 2001  month = 12  body = BODY_TEMPLATE%(year, month)  blen = len(body)  requestor = httplib.HTTP(SERVER_ADDR, SERVER_PORT)  requestor.putrequest("POST", "cal-server")  requestor.putheader("Host", SERVER_ADDR)  requestor.putheader("Content-Type", "text/plain; charset="utf-8"")  requestor.putheader("Content  reply_body = requestor.getfi-Length", str(blen))  requestor.putheader("SOAPAction", "http://uche.ogbuji.net/eg/ws/simple-car")  requestor.endheaders()  requestor.send(body)  (status_code, message, reply_headers) = requestor.getreply()le().read()  print "status code:", status_code  print "status message:", message  print "HTTP reply body:\n", reply_bodyif __name__ == "__main__":  GetMonth()


下面的會話示範了這個測試的運行情況。

$ python testcal.pystatus code: 200status message: OKHTTP reply body:<?xml version="1.0" encoding="UTF-8"?>  December 2001Mo Tu We Th Fr Sa Su        1 2 3 4 5 6 7 8 910 11 12 13 14 15 1617 18 19 20 21 22 2324 25 26 27 28 29 3031


仔細審查的位元組

如果您尋找行 self.debug = 0 並把“0”改為“1”(這是 SOAP.py 版本 0.9.7 中的第 210 行),有一件要注意的事情是您可以獲得被交換的實際 SOAP 訊息的詳細資料和用於調試與跟蹤的其它關鍵資料,這對您很有用。作為樣本,下面提供了一個會話,它是開啟了調試資訊顯示開關的以前的 curses.py 程式的一個會話:

$ python curse.py *** Outgoing HTTP headers **********************************************POST /scripts/Haddock.exe/soap/IHaddock HTTP/1.0Host: www.tankebolaget.seUser-agent: SOAP.py 0.9.7 (actzero.com)Content-type: text/xml; charset="UTF-8"Content-length: 523SOAPAction: "urn:HaddockIntf-IHaddock#Curse"*************************************************************************** Outgoing SOAP ******************************************************<?xml version="1.0" encoding="UTF-8"?>us*************************************************************************** Incoming HTTP headers **********************************************HTTP/1.? 200 OKServer: Microsoft-IIS/5.0Date: Tue, 11 Sep 2001 16:40:19 GMTContent-Type: text/xmlContent-Length: 528Content:*************************************************************************** Incoming SOAP ******************************************************<?xml version="1.0" encoding="UTF-8"?>Anacoluthons!************************************************************************What captain Haddock had to say: "Anacoluthons!"


為進行比較,您可以在帶有下列代碼的舊的 Python 指令碼或程式中獲得相同的資訊:

import calendarreturn calendar.month(2001, 10)


SOAP.py 總結

我們已經注意到了,雖然 SOAP.py 的互通性還存在一些問題,但可用的調試工具可望提供協助。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.