320 likes | 623 Views
Web услуги – SOAP протокол. Въведение в SOAP. SOAP е XML – базиран протокол, позволяващ обмен на информация между приложенията, изпълнявани от различни операционни системи, с различни технологии и езици чрез HTTP . Какво представлява SOAP?
E N D
Въведение в SOAP • SOAPе XML– базиран протокол, позволяващ обмен на информация между приложенията, изпълнявани от различни операционни системи, с различни технологии и езици чрез HTTP. • Какво представлява SOAP? • SOAP – съкращение наSimple Object Access Protocol • SOAP е протокол за връзка • SOAP е формат за изпращане на съобщения • SOAP е създаден за връзка чрез Internet • SOAP е платформено независим • SOAP е езиково независим • SOAP се базира на XML • SOAP е прост и с възможност за разширение • SOAP е развит като W3C стандарт
Въведение в SOAP • Градивни елементи на SOAP съобщението (XML документ) • Елемент Envelope- определя XML документа като SOAP съобщение • Незадължителен елемент Header– съдържа заглавна информация • Задължителен елемент Body– съдържа информация за извикване и за отговор • Незадължителен елемент Fault– осигурява информация за грешките по време на обработката на съобщението • Всички тези елементи са декларирани в област на данните по подразбиране за SOAP envelope: http://www.w3.org/2001/12/soap-envelope • Област на данни по подразбиране за SOAP кодиране и типове данни: http://www.w3.org/2001/12/soap-encoding
Въведение в SOAP • Синтактични правила • SOAP съобщението трябва да е кодирано с XML • SOAP съобщението трябва да използва SOAP Envelope namespace • SOAP съобщението трябва да използва SOAP Encoding namespace • SOAP съобщението не трябва да съдържа указване на DTD • SOAP съобщението не трябва да съдържа XML обработващи инструкции
Въведение в SOAP • Скелет на SOAP съобщение <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ... ... </soap:Header> <soap:Body> ... ... <soap:Fault> ... ... </soap:Fault> </soap:Body> </soap:Envelope>
Въведение в SOAP • Елемент SOAP ENVELOPE • Задължителният елементSOAP Envelopeе корен заSOAPсъобщението. Той дефинира XML документа като SOAP съобщение. • Атрибутът encodingStyleдефинира типовете данни, използвани в документа. Той може да фигурира при всеки SOAP елемент и ще се прилага за съответния елемент и неговите наследници. SOAP съобщението няма подразбиращо се кодиране. <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> ... //Информацията на съобщението се намира тук ... </soap:Envelope> soap:encodingStyle="URI"
Въведение в SOAP • Елемент SOAP HEADER • Ако има такъв елемент, той трябва да бъде първи childелемент наEnvelope. • Непосредствените елементи childнаHeaderтрябва да се определят от област данни. • SOAP дефинира 3 атрибута в областта данни по подразбиране ("http://www.w3.org/2001/12/soap-envelope"). Те са: actor, mustUnderstandиencodingStyle. • Атрибутите, дефинирани в SOAP Headerопределят как реципиента ще обработва SOAP съобщението (кои части и задължително ли). <?xml version="1.0"?> <soap:Envelope . . . <soap:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1">234</m:Trans> </soap:Header> . . . </soap:Envelope> Съдържание на HEADER: "Trans" елемент, атрибут "mustUnderstand" със стойност "1", стойност 234.
Въведение в SOAP • Елемент SOAP HEADER • SOAP съобщението може да пътува от изпращащия до получателя, минавайки през различни точки по време на пътя. Не всички части на съобщението могат да се считат за задължителни • Атрибут actorможе да се използва за да адресира елемент Headerкъм конкретна крайна точка. . . . <soap:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:actor="http://www.w3schools.com/appml/"> 234 </m:Trans> </soap:Header> . . . soap:actor="URI"
Въведение в SOAP • Елемент SOAP HEADER • Атрибут mustUnderstand се използва за да укаже дали headerвхода е задължителен или не за реципиента по отношение на обработката. • Ако се добави "mustUnderstand="1"към елемент childна елементаHeader, то последното дава индикация, че приемникът, обработвайки Header трябва да разпознае елемента. Ако приемникът не го разпознае, то трябва да даде грешка при обработката на Header. . . . <soap:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1"> 234 </m:Trans> </soap:Header> ... soap:mustUnderstand= "0 | 1"
Въведение в SOAP • Елемент SOAP BODY • Задължителният елемент SOAP Body съдържа SOAP съобщението, предназначено за задължителната крайна точка. • Непосредствените елементи childна елементаSOAP Bodyмогат да бъдат определени с област данни. SOAP дефинира един елемент в елементаBodyв областта данни по подразбиране ("http://www.w3.org/2001/12/soap-envelope"). Това е елемента SOAP Fault, който се използва за индикация на съобщение за грешка. m:GetPrice и item елементи са специфични за приложението (не са част от SOAP стандарта) . . . <soap:Body> <m:GetPrice xmlns:m="http://www.w3schools.com/prices"> <m:Item>Apples</m:Item> </m:GetPrice> </soap:Body> . . . Търси се цената на ябълките
Въведение в SOAP • Елемент SOAP BODY • SOAP отговорът изглежда по следния начин: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices"> <m:Price>1.90</m:Price> </m:GetPriceResponse> </soap:Body> </soap:Envelope>
Въведение в SOAP • Елемент SOAP FAULT • Съобщение за грешка от SOAP съобщението се пренася в елементFault. • Ако има елемент Fault, то той трябва да е елемент “child”на елемента Body. • ЕлементFaultможе да бъде единствен в SOAP съобщението. • Елементът Faultима следните под-елементи: Под-елементОписание <faultcode> Код за идентификация на грешка <faultstring> Обяснение на грешката <faultactor> Причинител на грешката <detail> Съдържа специфична за приложението информация свързана към елемента Body
Въведение в SOAP • Елемент SOAP FAULT • Стойностите на faultcode,дефинирани по-долу трябва да се използват в елемента faultcodeпри описанието на грешки: ГрешкаОписание VersionMismatchНамерена невалидна област данни за елемент SOAP Envelope MustUnderstandЕлементът “child”на Header с атрибут mustUnderstandустановен в "1“ не е разбран ClientСъобщението е некоректно създадено или съдържа некоректна информация ServerИма проблем със сървъра и съобщението не може да се обработи
SOAP и HTTP • HTTPпротоколът комуникира над TCP/IP. Един HTTP клиент се свързва с HTTP сървър, използвайки TCP. След установяване на връзката, клиентът може да изпрати HTTP запитващо съобщение към сървъра: • Сървърът обработва запитването и изпраща HTTP отговор обратно към клиента. Отговорът съдържа код на състоянието, който индицира състоянието на запитването: POST /item HTTP/1.1 Host: 189.123.345.239 Content-Type: text/plain Content-Length: 200 200 OK Content-Type: text/plain Content-Length: 200 Сървърът връща код на състоянието 200. Това е стандартен успешен код за HTTP.
SOAP и HTTP 400 Bad Request Content-Length: 0 • Ако сървърът не може да декодира запитването, то той ще върне: • Методът SOAP еHTTP запитване/отговор, който спазва кодиращите правила на SOAP. • HTTP + XML = SOAP • Запитването SOAP може да бъдеHTTP POSTилиHTTP GETзапитване. • Запитването HTTP POSTспецифицира поне две HTTP заглавия: Content-TypeиContent-Length. • Заглавието Content-Typeза SOAP запитване и отговор дефинира тип MIME за съобщението и символно кодиране (незадължително), което се използва за XML bodyна запитването или отговора.
SOAP и HTTP Синтаксис Content-Type: MIMEType; charset=character-encoding • Заглавието Content-Lengthза SOAP запитване и отговор специфицира брой байтове в тялото на запитването или отговора. Пример POST /item HTTP/1.1 Content-Type: application/soap+xml; charset=utf-8 Синтаксис Content-Length: bytes Пример POST /item HTTP/1.1 Content-Type: application/soap+xml; charset=utf-8 Content-Length: 250
SOAP - пример • ЗапитванеGetStockPriceсе изпраща към сървъра. Запитването има параметър StockName. ПараметърътPriceще се върне в отговор.Областта данни за функцията е дефинирана на адрес:http://www.example.org/stock. SOAP запитване POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
SOAP - пример • ЗапитванеGetStockPrice– обяснения • Съобщението се транспортира чрез команда HTTP POST. Параметърът Host указва адреса на сървъра, към който е запитването за цената на стоката. • Envelope съдържа: 1) декларация на областта данни, характерна за SOAP; 2) атрибут за стила на кодиране на данните в съобщението (зависи от версията на SOAP). • Header отсъства в примера. • Body съдържа елемент GetStockPrice, дефиниран в област данни зависеща от приложението. Този елемент може да се счита от целевото приложение като извикване на метод GetStockPriceот обекта http://www.example.org/stock.
SOAP - пример SOAP отговор HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
WSDL и SOAP • WSDL (Web Services Description Language) е език базиран на XML и използван за описание и локализиране на Web услуги. • Web услугите са софтуерни компоненти, които са достъпни в intranet, extranet иInternet на базата на Web технологии и стандартизирана XML-базирана система за съобщения. • WSDLописва Web услугата и предоставяната функционалност, а SOAPсе използва от приложението – клиент за извикване на функциите от WSDLописанието. • ЕдинWSDLдокумент е XML документ. • Той съдържа множество от дефиниции за описание на web услугата като съдържа следните елементи: • <portType> - операциите, извършвани от web услугата • <message> - съобщенията, използвани от web услугата • <types> - типовете данни, използвани от web услугата • <binding> - протоколите за връзка, използвани от web услугата
WSDL <definitions> <types> definition of types........ </types> <message> definition of a message.... </message> <portType> definition of a port....... </portType> <binding> definition of a binding.... </binding> </definitions> Структура на WSDL документ WSDLдокументът може да съдържа и други елементи като разширения и елементи-услуги, които позволяват групиране на дефинициите на няколко webуслуги в единWSDLдокумент.
WSDL • WSDL Port • Елементът <portType> описва web услугата, операциите, които могат да бъдат извършени и включените съобщения. • Елементът <portType> може да се сравни с библиотечна функция (или модул или клас) от традиционното програмиране. • WSDL Message • Елементът<message>дефинира елементите данни на операцията. • Всяко съобщение може да се състои от една или повече части. Частите могат да се сравнят с параметри на функция. • WSDL Type • Елементът<types>дефинира типа данни, използвани от webуслугата. • За платформена независимост WSDLизползва синтаксиса наXML Schemaза дефиниране на типовете данни.
WSDL • WSDL Binding • Елементът <binding>дефинира формата на съобщението и особеностите на протокола за всеки порт. • WSDL пример Опростен WSDLдокумент <message name="getTermRequest"> <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/><output message="getTermResponse"/> </operation></portType>
WSDL • WSDL пример – обяснения • Елементът<portType>дефинира"glossaryTerms"като име на port, а"getTerm"като име на операция. • Операцията"getTerm"има едно входно съобщение, наречено "getTermRequest"и изходно съобщение, наречено "getTermResponse". • Елементите<message>дефинират частите на всяко съобщение и свързаните типове данни. • В сравнение с традиционното програмиране, glossaryTermsе библиотека а, "getTerm"е функция с "getTermRequest"за входен параметър иgetTermResponseкато резултантен параметър.
WSDL • WSDLPorts – описват интерфейсите (легалните операции) представени от web услугата. • Типове операции • Типът заявка – отговор е най-общият тип, но WSDLдефинира четири типа: ТипДефиниция One-way Операцията може да получи съобщение, но няма да върне отговор Request-response Операцията може да получи заявка и ще върне отговор Solicit-response Операцията може да изпрати заявка и ще чака за отговор Notification Операцията може да изпрати заявка, но няма да чака за отговор
WSDL • WSDLPorts • Операция One-way – пример • Операцията"setTerm"позволява вход на нови съобщения, използвайки съобщението "newTermValues"с входни параметри "term"и"value". Но не е дефиниран изход за операцията. <message name="newTermValues"> <part name="term" type="xs:string"/> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="setTerm"> <input name="newTerm" message="newTermValues"/> </operation> </portType > Порт "glossaryTerms" дефинира операцияone-wayс име"setTerm"
WSDL <message name="getTermRequest"> <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"><operation name="getTerm"><input message="getTermRequest"/><output message="getTermResponse"/></operation></portType> • WSDLPorts • Операция Request-response – пример • Операция"getTerm"изисква входно съобщение, наречено "getTermRequest"с параметър"term“ище върне изходно съобщение, наречено "getTermResponse"с параметър "value". Порт"glossaryTerms"дефинира операцияrequest-responseнаречена"getTerm".
WSDL • WSDLBinding (свързване към) SOAP • WSDL bindings дефинира формат на съобщението и детайлите на протокола за web услугата. • Операция Request-response – пример <message name="getTermRequest"> 1/2 <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"><operation name="getTerm"><input message="getTermRequest"/><output message="getTermResponse"/></operation></portType>
WSDL Два атрибута на елемента binding: name – име на връзката; type – указва порта на връзката (glossaryTerms) • WSDLBinding (свързване към) SOAP • Операция Request-response – пример <binding type="glossaryTerms" name="b1"> 2/2 <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <operation> <soap:operation soapAction="http://example.com/getTerm"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> Два атрибута на елемента soap:binding: style – document; transport – дефинира SOAPпротокола за използване (http)
WSDL • WSDLBinding (свързване към) SOAP • Операция Request-response – пример • Елементът operationдефинира всяка операция, която портът открива. • За всяка операция трябва да се дефинира съответноSOAPдействие. • Необходимо е и специфициране на кодирането на входа и изхода. За случая се използва "literal".