soap規(guī)范(完)
發(fā)表時間:2023-07-20 來源:明輝站整理相關軟件相關文章人氣:
[摘要]6. 在HTTP中使用SOAP這一節(jié)講述了如何在HTTP中使用SOAP。把SOAP綁定到HTTP,無論使用或不用HTTP擴展框架,都有很大的好處:在利用SOAP的形式化和靈活性的同時,使用HTTP種...
6. 在HTTP中使用SOAP
這一節(jié)講述了如何在HTTP中使用SOAP。把SOAP綁定到HTTP,無論使用或不用HTTP擴展框架,都有很大的好處:在利用SOAP的形式化和靈活性的同時,使用HTTP種種豐富的特性。在HTTP中攜帶SOAP消息,并不意味著SOAP改寫了HTTP已有的語義,而是將構建在HTTP之上SOAP語義自然地對應到HTTP語義。
SOAP自然地遵循HTTP的請求/應答消息模型使得SOAP的請求和應答參數(shù)可以包含在HTTP請求和應答中。注意,SOAP的中間節(jié)點與HTTP的中間節(jié)點并不等同,即,不要期望一個根據(jù)HTTP連接頭中的域尋址到的HTTP中間節(jié)點能夠檢查或處理HTTP請求中的SOAP消息。
在HTTP消息中包含SOAP實體時,按照RFC2376[3] HTTP應用程序必須使用媒體類型 "text/xml"。
6.1 SOAP HTTP請求
雖然SOAP可能與各種HTTP請求方式相結合,但是綁定僅定義了在HTTP POST請求中包含SOAP消息。(第7節(jié)中描述了如何在RPC中使用SOAP,第6.3節(jié)描述了如何使用HTTP擴展框架)
6.1.1 HTTP頭中SOAPAction域
一個HTTP請求頭中的SOAPAction域用來指出這是一個SOAP HTTP請求,它的值是所要的URI。在格式、URI的特性和可解析性上沒有任何限制。當HTTP客戶發(fā)出SOAP HTTP請求時必須使用在HTTP頭中使用這個域。
soapaction= "SOAPAction" ":" [ <"> URI-reference <"> ]
URI-reference = <as defined in RFC 2396 [4]>
HTTP頭中SOAPAction域使服務器(如防火墻)能正確的過濾HTTP中SOAP請求消息。如果這個域的值是空字符串(""),表示SOAP消息的目標就是HTTP請求的URI。這個域沒有值表示沒有SOAP消息的目標的信息。
例子:
SOAPAction: "http://electrocommerce.org/abc#MyMessage"
SOAPAction: "myapp.sdl"
SOAPAction: ""
SOAPAction:
6.2 SOAP HTTP應答
SOAP HTTP遵循HTTP 中表示通信狀態(tài)信息的HTTP狀態(tài)碼的語義。例如,2xx狀態(tài)碼表示這個包含了SOAP組件的客戶請求已經(jīng)被成功的收到,理解和接受。
在處理請求時如果發(fā)生錯誤,SOAP HTTP服務器必須發(fā)出應答HTTP 500 "Internal Server Error",并在這個應答中包含一個SOAP Fault元素(見4.4節(jié))表示這個SOAP處理錯誤。
6.3 HTTP擴展框架
一個SOAP消息可以與HTTP擴展框架 [6]一起使用以區(qū)分是否有SOAP HTTP請求和它的目標。
是使用擴展框架或是普通的HTTP關系到通信各方的策略和能力。通過使用一個必需的擴展聲明和"M-"HTTP方法名前綴,客戶可以強制使用HTTP擴展框架。服務器可以使用HTTP狀態(tài)碼510 "Not Extended"強制使用HTTP擴展框架。也就是說,使用一個額外的來回,任何一方都可以發(fā)現(xiàn)另一方的策略并依照執(zhí)行。
用來表示SOAP使用了擴展框架的擴展標志符是:
http://schemas.xmlsoap.org/soap/envelope/
6.4 SOAP HTTP舉例
例3 使用POST的SOAP HTTP
POST /StockQuote HTTP/1.1
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "http://electrocommerce.org/abc#MyMessage"
<SOAP-ENV:Envelope...
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope...
例4 使用擴展框架的SOAP HTTP
M-POST /StockQuote HTTP/1.1
Man: "http://schemas.xmlsoap.org/soap/envelope/"; ns=NNNN
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
NNNN-SOAPAction: "http://electrocommerce.org/abc#MyMessage"
<SOAP-ENV:Envelope...
HTTP/1.1 200 OK
Ext:
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope...
7. 在RPC中使用SOAP
設計SOAP的目的之一就是利用XML的擴展性和靈活性來封裝和交換RPC調(diào)用。這一節(jié)定義了遠程過程調(diào)用和應答的統(tǒng)一表示形式。
雖然可以預計到這種表示形式最可能被用于與第5節(jié)中定義的編碼方式相結合,但也可能有其它的表示形式。SOAP的encodingStyle屬性(見4.3.2節(jié))可以用來表明方法調(diào)用和應答都使用這一節(jié)所指定的表示方式。
在RPC中使用SOAP和SOAP協(xié)議綁定(見第6節(jié))是緊密相關的。在使用HTTP作為綁定協(xié)議時,一個RPC調(diào)用自然地映射到一個HTTP請求,RPC應答同樣映射到HTTP應答。但是,在RPC中使用SOAP并不限于綁定HTTP協(xié)議。
要進行方法調(diào)用,以下的信息是必需的:
目標對象的URI
方法名
方法signature(可選)
方法的參數(shù)
頭數(shù)據(jù)(可選)
SOAP依靠協(xié)議綁定提供傳送URI的機制。例如,對HTTP來說,請求的URI指出了調(diào)用的來源。除了必須是一個合法的URI之外,SOAP對一個地址的格式?jīng)]有任何限制。(更多URI的信息參見 [4])
7.1 RPC和SOAP體
RPC方法調(diào)用和應答都包含在SOAP Body元素中(見4.3節(jié)),它們使用如下的表示形式:
一個方法調(diào)用用一個結構表示
一個方法調(diào)用被看作一個單個的結構,每個[in]和[in/out]參數(shù)有一個accessor。結構的名和類型與方法相同。
每個[in]和[in/out]參數(shù)都被看作一個accessor,這個accessor的名和類型與參數(shù)的名和類型相對應。它們的出現(xiàn)順序和方法中定義的參數(shù)順序相同。
一個方法應答用一個結構表示。
一個方法應答被看作一個單個的結構,返回值和每個[in]和[in/out]參數(shù)有一個accessor。第一個accessor是返回值,之后是參數(shù)accessor,參數(shù)accessor的出現(xiàn)順序和方法中定義的參數(shù)順序相同。
每個參數(shù)accessor的名稱和類型與參數(shù)的名稱和類型相對應。返回值accessor的名稱并不重要。同樣,結構的名稱也不重要,不過,通常在方法名稱的后面加上字符串"Response"作為結構的名稱。
方法錯誤使用SOAP Fault元素(見4.4節(jié))表示。如果綁定的協(xié)議有額外的規(guī)則表示錯誤,則這些規(guī)則也必須要遵從。
正如上面所述,方法調(diào)用和應答結構可以按照第5節(jié)中規(guī)則編碼,或者用encodingStyle屬性(見4.1.1節(jié))指定編碼方式。
應用程序可以處理缺少參數(shù)的請求,但是可能返回一個錯誤。
因為返回結果表示調(diào)用成功,錯誤表示調(diào)用失敗,所以,在方法應答中同時包含返回結果和錯誤是錯誤的。
7.2 RPC和SOAP頭
在RPC編碼中,可能會有與方法請求有關但不是正規(guī)的方法signature的附加信息。如果這樣,它必須作為SOAP頭元素的子元素。
使用這種頭元素的一個例子是在消息中傳遞事務ID。由于事務ID不是方法signature的一部分,通常由底層的組件而不是應用程序代碼控制,所以沒有一種直接的方法在調(diào)用中傳遞這個必要的信息。通過在頭中添加一個給定名字的條目,接收方的事務管理器就可以析取這個事務ID,而且不影響遠程過程調(diào)用的代碼。
8. 安全性考慮
這篇文檔中沒有涉及完整性和保密性,這些問題將在以后的版本中描述。
9. 參考文獻
[1] S. Bradner, "The Internet Standards Process -- Revision 3", RFC2026, Harvard University, October 1996
[2] S. Bradner, "Key words for use in RFCs to Indicate Requirement Levels", RFC 2119, Harvard University, March 1997
[3] E. Whitehead, M. Murata, "XML Media Types", RFC2376, UC Irvine, Fuji Xerox Info. Systems, July 1998
[4] T. Berners-Lee, R. Fielding, L. Masinter, "Uniform Resource Identifiers (URI): Generic Syntax", RFC 2396, MIT/LCS, U.C. Irvine, Xerox Corporation, August 1998.
[5] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2616, U.C. Irvine, DEC W3C/MIT, DEC, W3C/MIT, W3C/MIT, January 1997
[6] H. Nielsen, P. Leach, S. Lawrence, "An HTTP Extension Framework", RFC 2774, Microsoft, Microsoft, Agranat Systems
[7] W3C Recommendation "The XML Specification"
[8] W3C Recommendation "Namespaces in XML"
[9] W3C Working Draft "XML Linking Language". This is work in progress.
[10] W3C Working Draft "XML Schema Part 1: Structures". This is work in progress.
[11] W3C Working Draft "XML Schema Part 2: Datatypes". This is work in progress.
[12] Transfer Syntax NDR, in "DCE 1.1: Remote Procedure Call"
[13] N. Freed, N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC2045, Innosoft, First Virtual, November 1996
A. SOAP封裝舉例
A.1 請求編碼舉例
例5 類似于例1,但有一個必要的頭
POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Header>
<t:Transaction
xmlns:t="some-URI"
SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="Some-URI">
<symbol>DEF</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
例6 類似于例1,但有多個請求參數(shù)
POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Body>
<m:GetLastTradePriceDetailed
xmlns:m="Some-URI">
<Symbol>DEF</Symbol>
<Company>DEF Corp</Company>
<Price>34.1</Price>
</m:GetLastTradePriceDetailed>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
A.2 應答編碼舉例
例7 與例2類似,但有必要的頭部
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Header>
<t:Transaction
xmlns:t="some-URI"
xsi:type="xsd:int" mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:GetLastTradePriceResponse
xmlns:m="Some-URI">
<Price>34.5</Price>
</m:GetLastTradePriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
例8 與例2類似,但有一個結構
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Body>
<m:GetLastTradePriceResponse
xmlns:m="Some-URI">
<PriceAndVolume>
<LastTradePrice>
34.5
</LastTradePrice>
<DayVolume>
10000
</DayVolume>
</PriceAndVolume>
</m:GetLastTradePriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
例9 與例2類似,但處理必要的頭出錯
HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:MustUnderstand</faultcode>
<faultstring>SOAP Must Understand Error</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
例10 與例2類似,但處理Body出錯
HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Server Error</faultstring>
<detail>
<e:myfaultdetails xmlns:e="Some-URI">
<message>
My application didn't work
</message>
<errorcode>
1001
</errorcode>
</e:myfaultdetails>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>