JAVA web service --- overview


Webサービスの登場は、Unixに発表するJAVAで開発された有料システムが呼び出したいなど、異なるプラットフォーム上のソフトウェアアプリケーションシステム間の相互通信を解決するためである.Netが開発したNTに公開された在庫システムの機能.以前、このようなニーズはEAI(エンタープライズソフトウェア統合)と呼ばれていました.その後、このような需要が後で現れる以上、なぜ開発時に考慮しないのか、例えば在庫システムを開発する際、ユーザーがGUIで在庫を検索できるほか、他のシステムにプログラムインタフェースを提供していると考えられています.この設計をSOA(サービス向けアーキテクチャ)と呼ぶ.【Webサービスがこのようなニーズを達成できるほか、Messaging、メッセージミドルウェアがよく用いられる】
Webサービスといえば、WSDLとSOAPを言わなければなりません.WSDLは、サービスを提供するやつが何ができるか、SOAPが通信を行き来する内容がどのようなフォーマットであるべきかを説明しています.この2つのものが真っ赤になるのは、巨人XMLの肩、特にWSDLに立っているからだ.
WSDLのフルネームはwebサービスdescription languageで、XML形式で、ルートノードはdefinitionsで、5つのサブノード、types、message、portType、binding、サービスがあります.それらの関係はtypesがmessageに用いられ,messageがportTypeに用いられ,portTypeがbindingに用いられ,bindingがserviceに用いられる.   
WSDLファイルを手に入れたら、サービスから見たほうがいいです.
サービス:このサービスの名前、このサービスのアドレス、そしてbinding('bingding=')について説明します.
    e.g.
    <wsdl:service name="WSCXFProviderService">
        <wsdl:port name="WSCXFProviderPort"
            binding="tns:WSCXFProviderServiceSoapBinding">
            <soap:address
                location="http://localhost:8080/WSCXFProviderPort" />
        </wsdl:port>
    </wsdl:service>    
binding:webserviceを呼び出すときの通信プロトコルとSOAPパケットの形成のいくつかの詳細を説明する.【transport,style,use】
bingdingは'type='でportTypeに関連付けられ、1つのbindingに複数のoperationがあることができ、operationをこのwebサービスが提供する機能として理解することができ、styleとuseの定義(関数)を含む.
    e.g.
    <wsdl:binding name="WSCXFProviderServiceSoapBinding"
        type="tns:WSCXFProvider">
        <soap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="testWS">
            <soap:operation soapAction="" style="document" />
            <wsdl:input name="testWS">
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output name="testWSResponse">
                <soap:body use="literal" />
            </wsdl:output>
            <wsdl:fault name="IllegalArgumentException">
                <soap:fault name="IllegalArgumentException"
                    use="literal" />
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
Styleはdocumentおよびrpcであることができる.
RPC:転送されるrequestは、呼び出すメソッドの説明、メソッド名、パラメータ...
Document:転送されたrequestはtypeでのパラメータの定義に合致する「ドキュメント」であり、方法の説明は必要ない.
useはliteralおよびencdingです.
encoding:転送されるrequestのパラメータはsoapで規定されたタイプであり、各elementには1...
Document:転送されたrequestelementではelementにタイプの説明はなく、受信側はWSDLで定義typeに従ってチェックする.
portType:このサービスがどのような機能を提供できるか、これらの機能と対話するときのメッセージフォーマットについて説明します.
同様に、1つのportTypeに複数のoperationがあり、portTypeをJAVAのインタフェース(Interface)と理解することができ、operationはこれらのインタフェース定義の関数である.
  e.g.
    <wsdl:portType name="WSCXFProvider">
        <wsdl:operation name="testWS">
            <wsdl:input name="testWS" message="tns:testWS"></wsdl:input>
            <wsdl:output name="testWSResponse"
                message="tns:testWSResponse">
            </wsdl:output>
            <wsdl:fault name="IllegalArgumentException"
                message="tns:IllegalArgumentException">
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:portType>
message:ある機能を呼び出すときのrequest,response,faltのフォーマットを定義します.
    e.g.
    <wsdl:message name="testWS">
        <wsdl:part name="parameters" element="tns:testWS"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="IllegalArgumentException">
        <wsdl:part name="IllegalArgumentException"
            element="tns:IllegalArgumentException">
        </wsdl:part>
    </wsdl:message>
    <wsdl:message name="testWSResponse">
        <wsdl:part name="parameters" element="tns:testWSResponse">
        </wsdl:part>
    </wsdl:message>
types:messageでrequest,response,faltの具体的なtypeを定義します.
【messageで直接typesを定義しないで、typesが再利用できる】
    e.g.
    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:tns="http://test.cxf.bt.com/"
            attributeFormDefault="unqualified" elementFormDefault="unqualified"
            targetNamespace="http://test.cxf.bt.com/">
            <xs:element name="testWS" type="tns:testWS" />
            <xs:element name="testWSResponse" type="tns:testWSResponse" />
            <xs:complexType name="testWS">
                <xs:sequence>
                    <xs:element minOccurs="0" name="arg0"
                        type="xs:string" />
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="testWSResponse">
                <xs:sequence>
                    <xs:element minOccurs="0" name="return"
                        type="xs:string" />
                </xs:sequence>
            </xs:complexType>
            <xs:element name="IllegalArgumentException"
                type="tns:IllegalArgumentException" />
            <xs:complexType name="IllegalArgumentException">
                <xs:sequence />
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
SOAP:simple object access protocal、protocalと呼ばれ、通信プロトコルと誤解されることが多いが、実はフォーマットプロトコルであるべきだ.
Envelope要素はSOAPメッセージのルート要素です.
オプションのSOAPヘッダー要素には、認証、支払などのSOAPメッセージに関するアプリケーション固有の情報を含めることができます.ヘッダー要素が提供される場合は、Envelope要素の最初のサブ要素である必要があります.
必要なSOAP Body要素は、メッセージのエンドポイントに送信しようとする実際のSOAPメッセージを含むことができる.
Bodyにはメッセージのメッセージボディ(payload)またはエラー時のSOAP Fault要素が含まれています.Fault要素が提供されている場合は、Body要素のサブ要素でなければなりません.SOAPメッセージでは、Fault要素は一度しか表示されません.    
    e.g.    WSDL SOAP request:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test.cxf.bt.com/">
       <soapenv:Header/>
       <soapenv:Body>
          <test:testWS>
             <arg0>message passed in</arg0>
          </test:testWS>
       </soapenv:Body>
    </soapenv:Envelope>
         SOAP response:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
       <soap:Body>
          <ns2:testWSResponse xmlns:ns2="http://test.cxf.bt.com/">
             <return>Returned: message passed in</return>
          </ns2:testWSResponse>
       </soap:Body>
    </soap:Envelope>
          fault response:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
       <soap:Body>
          <ns1:Fault xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/">
             <faultcode>ns1:Server</faultcode>
             <faultstring>illegal argument.</faultstring>
             <detail>
                <ns1:IllegalArgumentException xmlns:ns1="http://test.cxf.bt.com/"/>
             </detail>
          </ns1:Fault>
       </soap:Body>
    </soap:Envelope>