SOAP
{
\"code\": 200,
\"title\": \"\",
\"content\": \"SOAP:簡單對象訪問協議,簡單對象訪問協議(SOAP)是一種輕量的、簡單的、基於XML的協議,它被設計成在WEB上交換結構化的和固化的資訊。SOAP可以和現存的許多因特網協議和格式結合使用,包括超文字傳輸協議(HTTP),簡單郵件傳輸協議(**TP),多用途網際郵件擴充協議(MIME)。它還支援從訊息係統到遠程過程調用(RPC)等大量的應用程式。\\n\\n四個部分\\n\\nsoap。n.(英文)肥皂\\n\\nSOAP:簡單對象訪問協議\\n\\n(SOAP:SimpleObjectAccessProtocol)\\n\\nSOAP包括四個部分:\\n\\nSOAP封裝:它定義了一個框架,該框架描述了訊息中的內容是什麼,誰應當處理它以及它是可選的還是必須的。\\n\\nSOAP編碼規則:它定義了一種序列化的機製,用於交換應用程式所定義的數據類型的實例。\\n\\nSOAPRPC表示:它定義了用於表示遠程過程調用和應答的協定。\\n\\nSOAP綁定:定義了一種使用底層傳輸協議來完成在節點間交換SOAP封裝的約定。\\n\\nSOAP訊息基本上是從發送端到接收端的單向傳輸,但它們常常結合起來執行類似於請求\\/應答的模式。所有的SOAP訊息都使用XML編碼。一條SOAP訊息就是一個包含有一個必需的SOAP的封裝包,一個可選的SOAP標頭和一個必需的SOAP體塊的XML文檔。\\n\\n把SOAP綁定到HTTP提供了同時利用SOAP的樣式和分散的靈活性的特點以及HTTP的豐富的特征庫的優點。在HTTP上傳送SOAP並不是說SOAP會覆蓋現有的HTTP語義,而是HTTP上的SOAP語義會自然的對映到HTTP語義。在使用HTTP作為協議綁定的場閤中,RPC請求對映到HTTP請求上,而RPC應答對映到HTTP應答。然而,在RPC上使用SOAP並不僅限於HTTP協議綁定。\\n\\nSOAP也可以綁定到TCP和UDP協議上。\\n\\n協議結構\\n\\nSOAP訊息格式:\\n\\nSOAP標頭\\n\\n\\n\\n\\n\\n目前主要在web服務中運用。\\n\\n語法規則\\n\\n這裡是一些重要的語法規則:\\n\\nSOAP訊息必須用XML來編碼\\n\\nSOAP訊息必須使用SOAPEnvelope命名空間\\n\\nSOAP訊息必須使用SOAPEncoding命名空間\\n\\nSOAP訊息不能包含DTD引用\\n\\nSOAP訊息不能包含XML處理指令\\n\\nSOAP核心技術\\n\\nSOAP采用了已經廣泛使用的兩個協議:HTTP和XML。HTTP用於實現SOAP的RPC風格的傳輸,而XML是它的編碼模式。采用幾行代碼和一個XML解析器,HTTP服務器(MS的IIS或Apache)立刻成為SOAP的ORBS。SOAP通訊協議使用HTTP來發送XML格式的資訊。HTTP與RPC的協議很相似,它簡單、配置廣泛,並且對防火牆比其它協議更容易發揮作用。HTTP請求一般由Web服務器軟件(如IIS和Apache)來處理,但越來越多的應用服務器產品正在支援HTTP。XML作為一個更好的網絡數據表達方式(NDR)。SOAP把XML的使用代碼化為請求和響應參數編碼模式,並用HTTP作傳輸。具體地講,一個SOAP方法可以簡單地看作遵循SOAP編碼規則的HTTP請求和響應,一個SOAP終端則可以看作一個基於HTTP的URL,它用來識彆方法調用的目標。像CORBA\\/IIOP一樣,SOAP不需要具體的對象綁定到一個給定的終端,而是由具體實現程式來決定怎樣把對象終端標識符映像到服務器端的對象。\\n\\nSOAP的優點\\n\\n(1)SOAP是可擴展的。SOAP無需中斷已有的應用程式,SOAP客戶端、服務器和協議自身都能發展。\\n\\n而且SOAP能極好地支援中間介質和層次化的體繫結構。\\n\\n(2)SOAP是簡單的。客戶端發送一個請求,調用相應的對象,然後服務器返回結果。這些訊息是XML格式的,並且封裝成符合HTTP協議的訊息。因此,它符合任何路由器、防火牆或代理服務器的要求。\\n\\n(3)SOAP是完全和廠商無關。SOAP可以相對於平台、操作係統、目標模型和編程語言獨立實現。另\\n\\n外,傳輸和語言綁定以及數據編碼的參數選擇都是由具體的實現決定的。\\n\\n(4)SOAP與編程語言無關。SOAP可以使用任何語言來完成,隻要客戶端發送正確SOAP請求(也就\\n\\n是說,傳遞一個合適的參數給一個實際的遠端服務器)。SOAP冇有對象模型,應用程式可以捆綁在任何\\n\\n對象模型中。\\n\\n(5)SOAP與平台無關。SOAP可以在任何操作係統中無需改動正常運行。\\n\\nPHPSOAP實例\\n\\nphp提供了一個專門用於soap操作的擴展庫,使用該擴展庫後\\n\\n可以直接在php中進行soap操作。下麵將介紹soap的基本操作。\\n\\n一、soap擴展的使用方法\\n\\nphp的soap擴展庫通過soap協議實現了客服端與服務器端的\\n\\n數據互動操作。從php5.0後,php就自帶了soap的支援。使用\\n\\nsoap擴展庫首先需要修改php安裝目錄下的配置檔案php.ini\\n\\n來啟用soap擴展庫。\\n\\n在php.ini檔案中找到如下所示的一行代碼,去掉前麵的註釋(;)。\\n\\n;extension=php_soap.dll\\n\\n修改後,重啟web服務器即可啟用soap擴展。在soap擴展庫中,主要\\n\\n包括三種對象。\\n\\n1、SoapServer\\n\\nSoapServer用於創建php服務器端頁麵時定義可被調用的函數及返回\\n\\n響應數據。創建一個SoapServer對象的語法格式如下:\\n\\n$soap=newSoapServer($wsdl,$array);\\n\\n其中,$wsdl為soap使用得wsdl檔案,wsdl是描述WebService的一種\\n\\n標準格式,若將$wsdl設置為null,則表示不使用wsdl模式。$array是\\n\\nSoapServer的屬性資訊,是一個數組。\\n\\nSoapServer對象的addFunction方法是用來聲明哪個函數可以被客戶端調用,\\n\\n語法格式如下:\\n\\n$soap->addFunction($function_name);\\n\\n其中,$soap是一個SoapServer對象,$function_name是需要被調用的函數名。\\n\\nSoapServer對象的handle方法用來處理用戶輸入並調用相應的函數,最後返回\\n\\n給客戶端處理的結果。語法格式如下:\\n\\n$soap->handle([$soap_request]);\\n\\n其中,$soap是一個SoapServer對象,$soap_request是一個可選參數,用來表示\\n\\n用戶的請求資訊。如果不指定$soap_request,則表示服務器將接收用戶的全部\\n\\n請求。\\n\\n2、SoapClient\\n\\nSoapClient用於調用遠程服務器上的SoapServer頁麵,並實現了對相應函數的調用\\n\\n。創建一個SoapClient對象的語法格式如下:\\n\\n$soap=newSoapClient($wsdl,$array);\\n\\n其中,參數$wsdl和$array與SoapServer相同。\\n\\n創建SoapClient對象後,調用服務端頁麵中的函數相當於調用了SoapClient的方法,\\n\\n創建語法如下:\\n\\n$soap->user_function($params);\\n\\n其中,$soap是一個SoapClient對象,user_function是服務器端要調用的函數,$params\\n\\n是要傳入函數的參數。\\n\\n3、SoapFault\\n\\nSoapFault用於生成soap訪問過程中可能出現的錯誤。創建一個soapFault對象的語法格式\\n\\n如下:\\n\\n$fault=newSoapFault($faultcode,$faultstring);\\n\\n其中,$faultcode是用戶定義的錯誤代碼,$faultstring是用戶自定義的錯誤資訊。soapFault\\n\\n對象會在服務器端頁麵出現錯誤時自動生成,或者通過用戶自行創建SoapFault對象時生成。對於\\n\\nSoap訪問時出現的錯誤,客戶端可通過捕捉SoapFalut對象來獲得相應的錯誤資訊。\\n\\n在客戶端捕獲SoapFault對象後,可以通過下麵的代碼獲得錯誤代碼和錯誤資訊。\\n\\n$fault->faultcode;\\/\\/錯誤代碼\\n\\n$fault->faultstring;\\/\\/錯誤資訊\\n\\n其中,$fault是在前麵創建的SoapFault對象。\\n\\n約翰·“肥皂”·麥克塔維什上尉\\n\\n(Cpt.John`Soap`MacTavish):《使命召喚\\n\\n-現代戰爭》中的重要人\\n\\n物兼主人公。\\n\\n《使命召喚4:現代戰爭》及《使命召喚:現代戰爭2》、《使命召喚8:現代戰爭3》的主角。\\n\\n在MW1中,還隻是中士的他和隊長普萊斯一同參加了SAS劇情的所有任務,在最後一關紮卡耶夫殺死了除肥皂和普萊斯之外的所有SAS隊友,但普萊斯扔給肥皂一把M1911,肥皂用這把M1911結果了紮卡耶夫的性命。使他二人轉危為安,之後被趕來救援的以隊長卡馬洛夫為首的俄政府軍所救。\\n\\n而在5年後(MW2)他已升任上尉(可能是因為殺死紮卡耶夫的緣故),加入141特勤隊(TaskForce\\n\\n141),併成為隊長。在遊戲中代替普萊斯上尉的位置來指導玩家\\n\\n(141特勤\\n\\n隊的Gary“Roach”Sandson“小強”)作戰。在一次任務中救出了他的前任長官——普萊斯上尉,普萊斯被關押了數年,聽見麥克塔維什的聲音,習慣性地叫了聲“Soap”,一旁的“蟲子”還傻乎乎地問道“誰是Soap……”。後在141特勤隊的主人公“小強”死後麥克塔維什再度成為遊戲的主人公。並和普萊斯一起潛入謝菲爾德將軍的基地,最後被謝菲爾德將軍用刀子紮入胸口,躺在地上眼睜睜看著謝菲爾德將軍和普萊斯搏鬥,當謝菲爾德把普萊斯上尉按在地上暴揍時,他以驚人的毅力從胸口拔出刀子,飛刀紮入謝菲爾德的左眼,殺死了謝菲爾德將軍,可他也身負重傷。最後普萊斯上尉艱難地從地上爬起,口中還唸叨著“Soap....Soap……”最後被普萊斯和前來增援的尼古萊一同抬上了飛機。(肥皂和普萊斯已經成為全球通緝犯)\\n\\n在使命召喚8:現代戰爭3中,受重傷的Soap被線人Nikolai和Price營救至安全屋,在Yuri等人的掩護下,Soap最終痊癒,並且再次加入到尋找並殺死Makarov的行動中。再一次的和Price並肩作戰,Soap的身手仍舊極為矯捷,根本看不出他曾經重傷瀕死。Price對他開玩笑道:“Soap,這一次你可以嘗試一下,不要再死了!”Soap回擊道:“老頭,你還是多關心一下你自己吧!”\\n\\n誰知Price擔心的事情還是發生了。在原捷克斯洛伐克首都Prague對Makarov的伏擊戰中,Soap和Yuri、Price中了Makarov的埋伏,在房間中的炸彈即將爆炸的時刻,Soap把Yuri推離了視窗,自己卻因為這短短的一瞬間耽擱再次身受重傷,在Yuri和Price的全力營救下,終於因為負傷過重且冇有及時得到醫療救助,死在了Price和Yuri的眼前。\\n\\n訊息格式\\n\\nSOAP在標準化訊息格式環境中,可以做所有它能完成的工作。訊息的主體部分是“text\\/xml”形式的MIME類型,並且包含一個SOAP封套。該封套是一個XML文檔。封套包含了\\n\\n報頭(可選的)和報文(必須有的)。封套的報文部分總是用於最終接收的訊息,而報頭項目可以確定執行中間處理的目標節點。附件、二進製數字及其他項目可以附加到報文上。\\n\\nSOAP提供了一種讓客戶端指定哪箇中間處理節點必須處理報頭項目的方法。由\\n\\n於報頭與SOAP訊息的主體內容是互不相關的,所以可用它們給訊息新增資訊,而不會影響對訊息報文的處理。\\n\\n例如,報頭可用於為報文中包含的請求提供數字簽名。在這種情形下,身份驗\\n\\n證\\/授權服務器可以處理報頭項目獨立於報文可以剝離資訊以驗證簽名。\\n\\n一旦通過驗證,封套的其餘部分將被傳遞給SOAP服務器,它將對訊息的報文進行\\n\\n處理。深入研究一下SOAP封套,有助於明瞭SOAP報頭和報文元素的位置和用途。\\n\\n剖析SOAP封套\\n\\nSOAP1.1規範提供了下麵的封套示例:SOAP-ENV:mustUnderstand=\\\"1\\\"5DEF\\n\\n在這個例子中,GetLastTradePrice請求被傳送給網絡上某個位置的一個存儲\\n\\n-引用服務。\\n\\n該請求帶有一個字元型參數,一個訂單符號,並在SOAP響應中返回一個浮點數。SOAP封套是表示SOAP訊息的XML文檔的頂層元素。XML命名空間用於將SOAP標識符與應用程式的特定標識符區分開。XML命名空間在SOAP中使用很頻繁,以把訊息的元素的作用域限製在一個特定的領域。理解SOAP命名空間有助於熟悉XML命名空間規範。如果您冇有理解命名空間,也可以簡單地把它看作一種鄰近的標識符,它通過把SOAP元素與特定的位置(真實的或想像的)相關聯,從而有助於惟一地標識SOAP元素。\\n\\n命名空間\\n\\n上麵例子中的第一個命名空間參照了在SOAP訊息中定義元素和屬性的SOAP模式。\\n\\n第二個命名空間參照了SOAP編碼,即前文中討論過的“Section5”數據類型。由於冇有指定額外的通用元素編碼,這種編碼將適用於整篇文檔。\\n\\n報頭\\n\\n在SOAP封套報頭示例中標識的第一個元素是一個transaction(交易)元素,它帶有一個命名空間屬性和一個值為1的mustUnderstand屬性。既然mustUnderstand的屬性值設為1,接受該訊息的服務器必須在該transaction節點上執行中間處理。您可以對此作這樣的解釋:服務器與客戶端事先已就管理該報頭元素處理的語義達成了一致,因而服務器確切地知道要處理的元素的內容,本例中元素的內容是“5”。如果接收訊息的服務器不理解transaction報頭的語義,它就會拒絕請求並拋出一個錯誤。錯誤元素是SOAP報文和定義良好的機製的一個特殊部分,用於把錯誤資訊送回給客戶端。\\n\\n像這樣的中間處理節點是SOAP可擴展性的一個例子。客戶端在SOAP訊息中包含這樣的節點,以在可以處理訊息的報文內容前,指示要發生的特殊的處理需要。要保證向後相容不能提供這種處理的現有的服務器,隻需把mustUnderstand屬性設置為0,它使操作是可選的。除了定義像上例中所示的transaction節點外,SOAP訊息還可包含報頭項目,它們用於指定節點執行身份驗證處理、加密、狀態的永久性、業務邏輯處理等。報頭有助於把SOAP構建成一種可擴展的模態包模型。隻需記住報頭處理是完全獨立於SOAP訊息的報文的。\\n\\n報文\\n\\n上麵例子中的SOAP報文包含一個XML載荷,我們可以推測RPC冇有為我們對其作\\n\\n詳細解釋。SOAP不僅是一種模態包模型,它還是一種相當神秘的包模型。冇有什麼跡象清楚地顯示RPC將要開始做什麼。我們在報文中所看到的是幾個XML元素,其中一個用命名空間進行了限製。它取決於SOAP服務器理解文檔語義並執行正確的處理。事實上,服務器提供了一種架構,以有意義的方式處理XML載荷。這裡的“有意義”意味著服務器在某些後台數據庫上調用遠程過程,以為訊息報文中包含的股票-符號元素接收股票價格。所有這些魔術般的操作都是在SOAPRPC幕後發生的。\\n\\nSOAP-RPC\\n\\nSOAP訊息本質上是一種從發送方到接收方的單向傳輸,但是SOAP經常組合到實現請求\\/響應機製中。要讓RPC使用SOAP,必須遵循幾條規則。首先,請求和響應訊息必須被編碼成結構類型。對一個操作的每一個輸入參數,都必須有一個同名元素(或輸入結構的成員)作為參數。對每一個輸出參數,都必須有一個名稱匹配的元素(或輸出結構的成員)。\\n\\n基於RPC的觀點,會省略一些更早一點顯示的SOAP訊息。隻帶有報文部分的SOAP請求與響應封套如下所示:\\n\\n請求DEF響應22.50請求要調用GetLastTradePrice方法。注意響應定義了GetLastTradePriceResponse操作。對附加響應到響應操作尾部的一個常用的SOAP調用規則是:創建響應結構。這種輸出結構包含一個名稱為price的元素,它返回方法調用的結果,假定為浮點型。\\n\\n在SOAP封套中冇有什麼地方的數據類型是顯式聲明的,注意到這一點很重要,\\n\\n這樣如果隻檢視SOAP訊息,就不會知道符號類型或結果參數price(價格)的類型。客戶端應用程式一般通過“Section5”編碼定義數據類型,或通過與服務器私下達成的協議來定義數據類型。在任何一種情況下,這些包含在SOAP訊息中的定義都不是顯式的。\\n\\n最後,為了進行RPC,需要一種低級協議如HTTP。儘管SOAP1.0規範強製要求使用HTTP作為傳輸協議,但SOAP\\n\\n1.1規範(及其姊妹規範“帶有附件的SOAP訊息”)允許使用FTP、**TP、甚至(可能)原始的TCP\\/IP套接字。所有這些對SOAP通用\\n\\n的序列化和編碼規則,也適用於RPC參數。\\n\\nSOAP用例\\n\\nInternet上某些地方的客戶端應用程式使用Web服務。\\n\\nWeb服務(通過SOAP)顯示對象方法。\\n\\n對象方法訪問Web上任意位置的遠程數據。\\n\\n對這些網絡命題應用傳遞邏輯,我們可以為Web服務和SOAP下一個總的結論:\\n\\n某些位置的客戶端可以使Web上任意位置的數據。這就是所要證明的。\\n\\n下麵是更加詳細一點的用例。\\n\\nSOAP客戶端使用UDDI註冊來查詢Web服務。不用直接操作WSDL,大多數情況下SOAP應用程式將硬連接到使用特定類型的和特定樣式的綁定,並且它將通過UDDI動態配置要調用的、與發現的Web服務匹配的服務地址。\\n\\n客戶端應用程式創建SOAP訊息,它是一個可執行想要的請求\\/響應操作的XML文檔。\\n\\n客戶端把SOAP訊息傳送給監聽SOAP請求的Web服務器上的JSP或ASP頁麵。\\n\\nSOAP服務器解析SOAP包並在其領域調用合適的對象方法,在SOAP文檔中包\\n\\n含的參數中傳遞。在SOAP服務器接收訊息之前,中間處理節點可以執行SOAP報頭指示的特殊功能,可視情況確定是否執行這步操作。\\n\\n請求對象執行指示的功能,並返回數據給SOAP服務器,它把響應打包到\\n\\nSOAP封套中。服務器把SOAP封套包裹在要發送回請求機器的響應對象中,如servlet或COM對象。\\n\\n客戶端接收對象,剝離出SOAP封套並把響應文檔發送給最初發出請求的程式,完成請求\\/響應循環。\\n\\n小結\\n\\nSOAP是一種基於XML的協議,它用於在分散式環境中發送訊息,並執行遠程過程調用。使用SOAP,不用考慮任何特定的傳輸協議(儘管通常選用HTTP協議),就能使數據序列化。用SOAP來構建平台與語言中性的互操作係統是一個好的選擇。總之,SOAP和Web服務已為在XML上構建分散式應用程式基礎結構所需的一切都考慮好了。通過解決COM和Java組件對象模型之間的衝突,SOAP把多個平台在訪問數據時所出現的不相容性問題減至最少。先把這些討論放在一邊,SOAP是一種適用於所有類型的對象實體的理想的媒介即使對於像BradPitt和EdwardNorton之類的好萊塢電影角色也可用作一種通訊媒介。就像在電影中一樣,期待著這種新技術帶來震撼世界的效果。\\n\\n\"
}