黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Python中SOAP項目的介紹及其在web開發(fā)中的應(yīng)用

系統(tǒng) 1914 0

SOAP.py 客戶機和服務(wù)器

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

目前為止,SOAP 實用程序好象仍是比較流行的使用 Python 的開放源代碼活動。下面是該項目的綱要以及它們目前的狀態(tài)。首先,參與者:

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

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

SOAPy 是在 2001 年 4 月公布的,目前處于 alpha 的預(yù)備階段,但現(xiàn)在好象停止開發(fā)了。

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

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

Orchard 是一個數(shù)據(jù)管理框架,基本上是一種用一個公共接口管理不同數(shù)據(jù)格式的方法。它實現(xiàn)了一個 SOAP 客戶機作為在遠程過程調(diào)用中向 SOAP 服務(wù)器發(fā)送 Orchard 數(shù)據(jù)項的基本方法(被稱為節(jié)點)。

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

安裝

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

上面的內(nèi)容簡言之就是建議您確保安裝所有的 Python SOAP 模塊時都使用與眾不同的包名稱。在我們的案例中,我們在 PYTHONPATH 中發(fā)現(xiàn)了一個合適的目錄并創(chuàng)建了一個 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 工具不創(chuàng)建空文件。

您已深入主題了

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

或者,我們可以試試。作者嘗試的第一個服務(wù),衛(wèi)生保健提供者定位器,在遇到下列報錯消息時顯示 SOAP 互操作性的當前狀態(tài)中的陷阱:

            
WebServices.SOAP.faultType: 
            
            
          


哦。SOAPAction 是一個 HTTP 頭,應(yīng)該是用來標記被訪問服務(wù)的。它是 SOAP 請求中必需的頭,但即便是設(shè)置了所需的頭(只是一對空的雙引號)后,上面的錯誤仍然存在。作者發(fā)現(xiàn)大多數(shù) MS SOAP 實現(xiàn)都存在這個問題。在試遍了這些服務(wù)后,我們斷定,Delphi 實現(xiàn)好象與 SOAP.py 合作得最好,但在試服務(wù)時 ― 即使是用 Delphi 實現(xiàn)時,也返回復(fù)雜的類型,比如列表,SOAP.py 無法使用它們,返回不帶數(shù)據(jù)的 WebServices.SOAP.typedArrayType 實例。

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

清單 1:訪問 Curse 生成器 SOAP 服務(wù)的 SOAP.py 程序

            
 #!/usr/bin/env python
#http://xmethods.net/detail.html?id=175
import sys
#Import the SOAP.py machinery
from WebServices import SOAP
remote = 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


          


把一切綜合在一起

導(dǎo)入庫后,我們將設(shè)置代理對象 remote 。這個對象將方法調(diào)用轉(zhuǎn)換為遠程 SOAP 消息。它的初始化器使用管理遠程請求的關(guān)鍵參數(shù): 服務(wù)器的 URI(被稱為“端點”)、請求元素的 XML 名稱空間(通過它,SOAP-as-RPC 將 口頭承諾變成 XML 基礎(chǔ))和 SOAPAction 頭值。

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

最后,我們調(diào)用名稱正確的方法,代理對象的 Curse 進行 SOAP 調(diào)用,然后打印出結(jié)果。下面的會話演示了對該程序的使用:

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


          


我們自己的 SOAP 服務(wù)器

用 SOAP.py 實現(xiàn) SOAP 服務(wù)器相當容易。作為一個示例,我們將仿建字段,還要實現(xiàn)一個很常見的服務(wù):一個程序,給出年份和月份,它將以字符串的形式打印出日歷。它的程序服務(wù)器是 清單 2(calendar-ws.py)。

清單 2:實現(xiàn)日歷服務(wù)器的 SOAP.py 程序

            
 #!/usr/bin/env python
import sys, calendar
#Import the SOAP.py machinery
from WebServices import SOAP
CAL_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()


          


進行過必要的導(dǎo)入后,我們?yōu)樽约旱姆?wù)器定義 SOAP 請求元素期望的名稱空間( CAL_NS )。接下來我們定義實現(xiàn)所有方法的類,這些方法將被公開為 SOAP 方法。大家也可以把單個函數(shù)作為 SOAP 方法注冊,但使用類方法是最靈活的,特別是當您想管理調(diào)用間的狀態(tài)時。這個 Calendar 類定義了一個方法 getMonth ,該方法使用 Python 的內(nèi)置日歷模塊在文本表單中返回月度日歷,同時它還定義了另一個返回整年日歷的方法。

然后創(chuàng)建 SOAP 服務(wù)器框架的一個實例,這個實例還帶有偵聽端口 8888 的指令。我們還必須創(chuàng)建 Calendar 類的一個實例,這個實例在下一行中被注冊用來處理 SOAP 消息,同時為其指出相關(guān)的名稱空間。最后,我們調(diào)用 serve_forever 方法,該方法直到進程終止才返回。

為運行服務(wù)器,請打開另一個命令 shell 并執(zhí)行 python calendar-ws.py 。執(zhí)行結(jié)束時使用 ctrl-C 殺死進程。

我們本來可以用也是用 SOAP.py 寫的客戶機測試服務(wù)器,但那太顯而易見了。我們還是用低級 Python 編寫客戶機把 SOAP 響應(yīng)作為 XML 字符串來構(gòu)建,并發(fā)送一條 HTTP 消息。這個程序(testcal.py)在 清單 3中。

清單 3:用 Python 核心庫寫的訪問日歷服務(wù)的客戶機

            
 import sys, httplib
SERVER_ADDR = "127.0.0.1"
SERVER_PORT = 8888
CAL_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_body
if __name__ == "__main__":
  GetMonth()


          


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

            
$ python testcal.py
status code: 200
status message: OK
HTTP reply body:


            
              
                
                  
                      December 2001
Mo Tu We Th Fr Sa Su
        1 2
 3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

                  
                
              
            
          


仔細審查的字節(jié)

如果您查找行 self.debug = 0 并把“0”改為“1”(這是 SOAP.py 版本 0.9.7 中的第 210 行),有一件要注意的事情是您可以獲得被交換的實際 SOAP 消息的詳細信息和用于調(diào)試與跟蹤的其它關(guān)鍵數(shù)據(jù),這對您很有用。作為示例,下面提供了一個會話,它是打開了調(diào)試信息顯示開關(guān)的以前的 curses.py 程序的一個會話:

            
$ python curse.py 
*** Outgoing HTTP headers **********************************************
POST /scripts/Haddock.exe/soap/IHaddock HTTP/1.0
Host: www.tankebolaget.se
User-agent: SOAP.py 0.9.7 (actzero.com)
Content-type: text/xml; charset="UTF-8"
Content-length: 523
SOAPAction: "urn:HaddockIntf-IHaddock#Curse"
************************************************************************
*** Outgoing SOAP ******************************************************


            
              
                
                  
                    us
                  
                
              
            
            
************************************************************************
*** Incoming HTTP headers **********************************************
HTTP/1.? 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 11 Sep 2001 16:40:19 GMT
Content-Type: text/xml
Content-Length: 528
Content:
************************************************************************
*** Incoming SOAP ******************************************************

            
              
                
                  
                    Anacoluthons!
                  
                
              
            
            
************************************************************************
What captain Haddock had to say: "Anacoluthons!"


          


為進行比較,您可以在帶有下列代碼的舊的 Python 腳本或程序中獲得相同的信息:

            
import calendar
return calendar.month(2001, 10)


          


SOAP.py 總結(jié)

我們已經(jīng)注意到了,雖然 SOAP.py 的互操作性還存在一些問題,但可用的調(diào)試工具可望提供幫助。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論