270 likes | 404 Views
WSDL 1.1. WSDL 1.1. 네트웍 상의 서비스를 기술하는 XML 문서 구성 types: 데이터 타입에 대한 정의 message : 교환되는 데이터의 추상적인 (abstract) 기술 operation: 서비스가 제공하는 action 에 대한 추상적인 기술 port type : 하나 이상의 endpoint 가 지원하는 operation 의 추상적인 모음 binding: 특정 port type 에 대한 구체적 (concrete) 인 프로토콜
E N D
WSDL 1.1 • 네트웍 상의 서비스를 기술하는 XML 문서 • 구성 • types: 데이터 타입에 대한 정의 • message : 교환되는 데이터의 추상적인(abstract) 기술 • operation: 서비스가 제공하는 action에 대한 추상적인 기술 • port type : 하나 이상의 endpoint가 지원하는 operation의 추상적인 모음 • binding: 특정 port type에 대한 구체적(concrete)인 프로토콜 • port : binding과 network상의 주소를 가지는 endpoint • service : 네트웍 enpoint (port)의 collection
WSDL Component <service>: Service 정의(port, binding) <port>: endpoint 정의 <binding>: service를 호출 하는 방법 정의(프로토콜, style) <portType>: interface 정의(operation, input, output) <operation>: method 정의 <message>: message 정의 <types>: datatypes 정의(XML schema)
<types> <element name="TradePriceRequest"> <complexType> <all> <elementname="tickerSymbol" type="string" /> 5 <message name="GetLastTradePriceInput"> <partname="body" element="xsd1:TradePriceRequest" /> </message> 4 <portType name="StockQuotePortType"> <inputmessage="impl:GetLastTradePriceInput" /> <outputmessage="impl:GetLastTradePriceOutput" /> 3 <binding name="StockQuoteSoapBinding“ type="impl:StockQuotePortType"> 1 2 <service> <port name="StockQuotePort“ binding="impl:StockQuoteBinding"> <service> WSDL을 읽는 방법
WSDL의 예 <binding name="QueryIPSoap" type="s0:QueryIPSoap"> s0:QueryIpSoap <portType> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> extensibility element <operation name="Query"> <soap:operation soapAction="http://ws.cdyne.com/Query" style="document" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <service name="QueryIP"> <port name="QueryIPSoap" binding="s0:QueryIPSoap"> s0:QueryIPSoap <binding> <soap:address location="http://ws.cdyne.com/whoisforip/queryip.asmx" /> extensibility element </port> </service> </defintion>
WSDL의 예 <?xml version="1.0" encoding="utf-8"?> <definitions xmlns:soap=“http://schemas.xmlsoap.org/wsdl/soap/” xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://ws.cdyne.com/" xmlns:soapenc=“http://schemas.xmlsoap.org/soap/encoding/” targetNamespace="http://ws.cdyne.com/" xmlns=“http://schemas.xmlsoap.org/wsdl/”/> <types> … </types> <message name="QuerySoapIn"> <part name="parameters" element="s0:Query" /> s0:Query는 <types>에 정의되어 있음 </message> <message name="QuerySoapOut"> <part name="parameters" element="s0:QueryResponse" /> </message> <portType name="QueryIPSoap"> <operation name="Query"> <input message="s0:QuerySoapIn" /> QuerySoapIn <message> <output message="s0:QuerySoapOut" /> QuerySoapOut <message> </operation> </portType>
WSDL의 예 • 데이터 타입을 정의하는데 사용하는 type system 에는 제한이 없으나 현재로서는 XML Schema를 일반적으로 사용함 <types> <s:schema elementFormDefault="qualified" targetNamespace="http://ws.cdyne.com/"> extensibility elelemt <s:element name="Query"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="Address" type="s0:Address" /> <s:element minOccurs="0" maxOccurs="1" name="LicenseKey" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="Address"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="IPaddress" type="s:string"/> <s:element minOccurs="0" maxOccurs="1" name="HostName" type="s:string"/> </s:sequence> </s:complexType> <s:element name="QueryResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="QueryResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> </s:schema> </types>
WSDL 도식화 created by XMLSpy
<types> <element name="TradePriceRequest"> <complexType> <all> <elementname="tickerSymbol" type="string" /> 5 <message name="GetLastTradePriceInput"> <partname="body" element="xsd1:TradePriceRequest" /> </message> 4 <portType name="StockQuotePortType"> <inputmessage="impl:GetLastTradePriceInput" /> <outputmessage="impl:GetLastTradePriceOutput" /> 3 <binding name="StockQuoteSoapBinding“ type="impl:StockQuotePortType"> 1 2 <service> <port name="StockQuotePort“ binding="impl:StockQuoteBinding"> <service> WSDL을 읽는 방법
WSDL SOAP Binding • SOAP 메시지 구성 방법을 기술 • <wsdl:binding> 및 <wsdl:port> 아래에 element 아래에 extensibility element로 기술 • soap:binding • soap:operation • soap:body • soap:header • soap:headerfault • soap:fault • soap:address
soap:binding • soap:binding <binding …> <soap:binding transport=“uri” style=“rpc|document”/> </binding> • style : • document • SOAP Body 구성시 <message>의 part들을 그대로 SOAP Body에 사용 • rpc • SOAP의 RPC convention에 따라서 SOAP Body 구성 • transport: SOAP메시지 전송에 사용될 transport • HTTP : http://schemas.soap.org/soap/http
soap:operation • soap:operation <binding> <operation…> <soap:operation soapAction=“uri” style=“rpc|document”/> </operation> </binding> • soapAction : SOAPAction의 값을 지정 • style: rpc/document. <soap:binding>에서 지정한 style을 override 할 수 있으나 일반적으로 이런 방식으로는 사용하지 않음
soap:body • soap:body <binding…> <operation…> <input> <soap:body parts=“nmtokens”? use=“literal|encoded”? encodingStyle=“uri-list”? namespace=“uri”?/> </input> </operation> </binding> • parts: SOAP Body에 사용될 part들. 생략하면 해당 메시지의 모든 파트가 사용됨 • use : • literal : <types>에 지정된 XML Schema의 instance를 SOAP 메시지 구성에 사용함 • encoded : <types>에 지정된 XML Schema에 encodingStyle에 지정된 encoding rule을 적용하여 SOAP 메시지에 담을 concrete한 메시지를 구성 • encodingStyle: • encoding에 사용될 encoding 방식을 기술 • namespace: • encoding시 types에 명시적으로 정의되지 않은 content에 적용되는 namespace
Document/RPC, Literal/SOAP Encoding ? • 네 가지 조합 • RPC/Encoded • RPC/Literal • DOC/Encoded • DOC/Literal • XML 문서의 validation • Encoded 방식 • WSDL의 <Types> 에 정의된 XML Schema를 따르지 않는 XML 문서가 발생될 수 있음 • encoded 방식의 XML 문서를 받아서 검증(validate) 할 수 없음 • Literal 방식 • WSDL의 <Types>에 정의된 XML Schema로 검증가능한 XML 문서를 주고 받음 • 현재까지, 그리고 향후에는… • 현재까지 RPC/Encoded 방식과 DOC/Literal 방식이 가장 많이 사용됨 • WS-I Basic Profile 에서는 interoperable한 SOAP 메시징에서는 SOAP Encoding 방식을 사용하는 것을 금지하고 있음 • 향후 웹서비스에서는 RPC/Literal과 , DOC/Literal 방식만이 interaoperable 할것 임 • 그러나 과거 호환성을 위해서 RPC/encoded 방식도 지원될 것. • SOAP 규격은 Document 중심으로 가고 있음
WSDL binding (I) RPC/Literal Document • <message name=“Request”> • <part name=“x” type=“xs:int”/> • </message> • <message name=“empty”/> • <portType name=“foo”> • <operation name=“method”> • <input message=“Request”/> • <output message=“empty”/> • </operation> • </portType> • <types> • <schema> • <element name=“xElement” type=“xs:int”/> • </schema> • </types> • <message name=“Request”> • <part name=“x” element=“xElement”/> • </message> • <message name=“empty”/> • <portType name=“foo”> • <operation name=“method”> • <input message=“Request”/> • <output message=“empty”/> • </operation> • </portType> RPC/Encoding • <message name=“Request”> • <part name=“x” type=“xs:int”/> • </message> • <message name=“empty”/> • <portType name=“foo”> • <operation name=“method”> • <input message=“Request”/> • <output message=“empty”/> • </operation> • </portType>
WSDL binding (II) RPC/ Literal Document • <soap:envelope> • <soap:body> • <method> • <x>5</x> • </method> • </soap:body> • </soap:envelope> • <soap:envelope> • <soap:body> • <xElement>5</xElement> • </soap:body> • </soap:envelope> RPC/Encoding • <soap:envelope> • <soap:body> • <method> • <x xsi:type=“xs:int”>5</x> • </method> • </soap:body> • </soap:envelope>
WSDL binding (III) Document/literal wrapped • <types> • <schema> • <element name=“method”> • <complexType> • <sequence> • <element name=“x” type=“xs:int”/> • </sequence> • </complexType> • </element> • </schema> • </types> • <message name=“Request”> • <part name=“parameters” element=“method”/> • </message> • <message name=“empty”/> • <portType name=“foo”> • <operation name=“method”> • <input message=“Request”/> • <output message=“empty”/> • </operation> • </portType • <soap:envelope> • <soap:body> • <method> • <x>5</x> • </method>> • </soap:body> • </soap:envelope>
<그림: top-down design> 웹서비스개발 모델 • 웹서비스 top-down 모델 • 웹 브라우저로 서비스의 URL에 접근 가능한 서비스 interface를 만든다. Ex) http://localhost:8080/axis/services/WidgetPrice • WSDL파일을 만들다. • 주고 받을 Type에 대한 정의를 한다. -> simple type 정의 • complex type 정의하고 simple type을 포함한다. • 웹서비스 툴을 이용 server skeleton JavaBeans components를 생성한다. • skeleton JavaBeans에 비즈니스 로직을 작성한다. • 웹서비스 툴을 이용 client stubJavaBeans components를 생성한다. • stubJavaBeans components에 비즈니스 로직을 작성한다. • Test
Custom Data Type [Order WSDL Type] <wsdl:types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Example6"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="ArrayOf_xsd_string"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> </restriction> </complexContent> </complexType> <complexType name="ArrayOf_xsd_int"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/> </restriction> </complexContent> </complexType> <complexType name="Order"> <sequence> <element name="customerName" nillable="true" type="xsd:string"/> <element name="itemCodes" nillable="true" type="impl:ArrayOf_xsd_string"/> <element name="quantities" nillable="true" type="impl:ArrayOf_xsd_int"/> <element name="shippingAddress" nillable="true" type="xsd:string"/> </sequence> </complexType> </schema> </wsdl:types> [Order Java class] public class Order { private String customerName; private String itemCodes[]; private int quantities[]; private String shippingAddress; }
Axis의 WSDL 지원 • WSDL 문서 제공 • 웹서비스 툴인 Axis에서 서비스를 전개할 때, 웹서비스 사용자들는 웹 브라우저로 서비스의 URL에 접근 가능 • URL의 끝에 "http://localhost:8080/axis/services/WidgetPrice?WSDL”를 덧붙이는 것에 의해 WSDL제공 • WSDL을 이용해 proxies(stub) 와 skeletons 제공 • AXIS WSDL -> Java tool : org.apache.axis.wsdl.WSDL2Java • WSDL -> Java class 매칭 • type -> java class(Adress, Book, Order), in/out parameter • portType -> interface class • binding -> stub, skeletons class • service -> client service interface, client service implementation • Client / Server 공통 • WidgetPrice.java (java.rmi.Remote usages), deploy.wsdd, undeploy.wsdd • Client proxies • WidgetPriceService.java (client side service interface) • WidgetPriceServiceLocator.java (client side service implementation) • WidgetPriceSoapBindingStub.java (Client side stub) • Server skeletons • WidgetPriceSoapBindingSkeleton.java (Server side skeleton) • WidgetPriceSoapBindingImpl.java (fill out the implementation)
Axis의 WSDL 지원 • Java2WSDL 도구 제공 • java2wsdl은 자바 클래스들에서 WSDL을 추출 제공 • ex) 아래와 같은 service Interface 작성후 java2wsdl실행 후 WSDL얻음 public interface WidgetPrice { public void setWidgetPrice(String widgetName, String price); public String getWidgetPrice(String widgetName); public String processOrder(Order order); }
definitions 네임스페이스 변경 • WSDL2.0에서의 변화 • W3C의 Web Services Description Working Group은 WSDL 2.0 working drafts on 26 March 2004 • definitions 네임스페이스 변경 <definitions name="StockQuote" targetNamespace="http://example.com/stockquote/definitions" xmlns:tns="http://example.com/stockquote/definitions" xmlns:xsd1="http://example.com/stockquote/schemas" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/"> --> <definitions name="StockQuote" targetNamespace="http://example.com/stockquote/definitions" xmlns:tns="http://example.com/stockquote/definitions" xmlns:xsd1="http://example.com/stockquote/schemas" xmlns:soap="http://www.w3.org/2003/11/wsdl/soap12" xmlns="http://www.w3.org/2003/11/wsdl">
message element(construct)의 삭제 <message name="GetLastTradePriceInput"> <part name="body" element="xsd1:TradePriceRequest"/> </message> <message name="GetLastTradePriceOutput"> <part name="body" element="xsd1:TradePrice"/> </message> --> <types> <schema targetNamespace="http://example.com/stockquote/definitions"> <element name="GetLastTradePriceInput" type="xsd1:TradePriceRequest"/> <element name="GetLastTradePriceOutput" type="xsd1:TradePrice"/> </schema> </types>
PortTypes 과 Ports변경 <portType name="StockQuotePortType"> -> <interface name="StockQuoteInterface"> <port name="StockQuotePort" binding="tns:StockQuoteBinding"> <soap:address location="http://example.com/stockquote"/> </port> -> <endpoint name="StockQuoteEndPoint" binding="tns:StockQuoteSoapBinding"> <wsoap:address location="http://example.com/stockquote"/> </endpoint>