WSDL原理

参考記事:https://blog.csdn.net/acmman/article/details/52179346

 

私たちはしばしば、我々はWebサービスインターフェイスもXML構成の一杯になる訪れ、その後、WSDLとXMLの関係はどのようなものです、WebServiceが「WSDL」という言葉を持っている参照してください?当社のサービスは、それが積み上げ取得できるようにする方法ですか?

以上これら以外知りたい、私たちは、WSDL、SOAPとUDDIを理解する必要があります。

 

実際には、WSDLは、Webサービスの定義Lanauage、すなわちWebサービス定義言語です。その顧客はWebサービスで提供されるgetので、私たちの前のブラウザXMLを訪問して、WSDLは、外国人で構成されていることをWebサービス定義言語を暴露、クライアントは、このXMLの終わりが提供するWSDL2Javaの命令翻訳サービスを通過します方法。

 

たとえば、WebServiceの:

< 定義のtargetNamespace = "http://impl.ws.cxf.java.org/" 名前= "HelloworldWs" > 
    < インポート名前空間= "http://ws.cxf.java.org/" 場所= "のhttp:/ /127.0.0.1:8082/sayHi?wsdl=1" /> 
    < バインディング= "HelloworldWsPortBinding" タイプ= "NS1:HelloWorldの" > < SOAP:結合輸送= "http://schemas.xmlsoap.org/soap/http " スタイル="文書」/> 
        < オペレーション= "sayHi" > 
            <石鹸:操作のsoapAction = "" />
            < 入力> 
            < SOAP:ボディ使用= "リテラル" /> 
        </ 入力> 
        < 出力> 
            < SOAP:ボディ使用= "リテラル" /> 
            </ 出力> 
    </ 動作> 
    < 操作= "getCatsByUser" > 
        < SOAP :操作のsoapAction = "" /> 
        < 入力> 
            < SOAP:ボディ使用= "リテラル" /> 
        </ 入力>
        < 出力> 
        <石鹸:ボディ使用= "リテラル" /> 
        </ 出力> 
    </ 動作> 
     </ 結合> 
     < サービス= "HelloworldWs" > 
         < ポート= "HelloworldWsPort" バインディング= "TNS:HelloworldWsPortBinding" > 
             < SOAP:アドレス場所= "http://127.0.0.1:8082/sayHi" /> 
         </ ポート> 
     </ サービス> 
</ 定義>

ラベルの後に離れて:

< 定義> 
     < インポート/> 
     < バインディング>
    ......
     </ バインディング> 
     < サービス= "HelloworldWs" >
        ......
     </ サービス> 
</ 定義>

私たちは、XMLのこの詳細な分析を見てください。

まず、最初の段落タグという名前の定義、Javaパッケージ内のtargetNamespace当量(輸入ののxmlnsのJavaと同等)。同じの当社のサービス側のHttp://impl.ws.cxf.java.org/その内容および実装クラスのパッケージ名。

ここで我々のパケットインタフェースであるインポートタグの名前空間は、位置は、外部WSDLドキュメントパスWebサービスインタフェース(http://127.0.0.1:8082/sayHi?wsdl=1)に曝されます。

したがって、上記<インポート/>インタフェース定義、次の<バインディング>と<サービス>タグが実装されているサービスです。

WSDL文書は、大きく以下のモジュールに分割されるように:

 

 

文書の1インターフェイス部

私たちは、最初の文書のインタフェース部分を分析し、我々はちょうどhttp://127.0.0.1:8082/sayHi?wsdl=1のインポート]タブの位置の上のアクセス・パスを見ています:

 

 

收起里面复杂的数据,其实大致为以下结构

 

 

其中type存放的是一个标准schema格式的数据

<types>
<xsd:schema>
<xsd:import namespace="http://ws.cxf.java.org/" schemaLocation="http://127.0.0.1:8082/sayHi?xsd=1"/>
</xsd:schema>
</types>

 

xsd:import中引入了一个namespace,location中引入了该接口所有数据类型,我们来访问一下http://127.0.0.1:8082/sayHi?xsd=1,得到:

 

 

 

我们可以看到里面包含了所有方法的输入参数类型和返回参数类型,其中的minOccurs是该参数出现的最小次数,maxOccurs是参数出现的最大次数。

像<xs:element name="return" type="tns:cat" minOccurs="0" maxOccurs="unbounded"/>这个标签的意思就是,像List中的Cat这种返回类型可能出现的个数是0-N个。

 

可以看到wsdl文档的最后有一个portType的标签对,里面存放了所有可以调用的WebService服务,然后里面是服务的输入输出,其中的message属性就对应上面的message属性。

 

 其中message属性的详细定义,就在types的xsd:schema中定义,而其中的xsd:import标签就引入了各种格式的定义文档路径。

 

所以,一次WebService的调用,其实并不是方法调用,而是发送SOAP消息(即XML文档片段)。

对于sayHi操作来说,传入的消息是:

<sayHi>
    <arg0>字符串</arg0>
</sayHi>
传出的消息是:
<sayHiResponse>
    <return>字符串</return>
</sayHiResponse>

 

对于getCatsByUser操作来说,传入的消息是:

<getCatsByUser>
    <arg0>
        <id>整数值</id>
        <name>字符串</name>
        <pass>字符串</pass>
        <address>字符串</address>
    </arg0>
</getCatsByUser>
传出的消息是:
<getCatsByUserResponse>
    <return>   --可能出现0-N次
        <id>整数值</id>
        <name>字符串</name>
        <color>字符串</color>
    </return>
</getCatsByUserResponse>

 

2.实现类部分文档

我们回到之前的路径http://127.0.0.1:8082/sayHi?wsdl:

 

 上面我们访问的http://127.0.0.1:8082/sayHi?wsdl=1是接口类的定义文档,所以上面<import/>是接口的定义,下面的<binding>和<service>标签是Service的实现。

 

bingding中绑定了可操作的方法,以及输入输出的参数。

service中定义了该WebService对外提供的服务接口地址。

 

所以整个WSDL的文档结构就是:

 

 通俗的说,WSDL文档描述了WebService如下3个方面:

  • what:该WebService包含“什么”操作。
  • how:该WebService的操作应该“怎么”调用。
  • where:该WebService的服务地址。

调用一次WebService的本质:

  1. 客户端把调用方法参数,转换成XML文档片段(SOAP消息,input消息),该文档片段必须服务WSDL定义的格式。
  2. 通过网络,把XML文档片段从客户端传送给服务器。
  3. 服务器接收到XML文档片段。
  4. 服务器解析XML片段,提取其中的数据,并把数据转换成调用WebService所需要的参数值。
  5. 服务器执行方法。
  6. 把执行的方法得到的返回值,再次转换生成XML文档片段(SOAP,output消息),该文档片段必须符合WSDL定义的格式。
  7. 通过网络,把XML文档片段传送给客户端。
  8. 客户端接收到XML文档片段。
  9. 客户端解析XML片段,提取其中的数据,并把数据转换成调用WebService所需要的返回值。

从上面调用本质来看,要一个语言支持WebService,唯一的要求就是:该语言支持XML文档解析、生成、支持网络传输。

只要得到WebService文档,程序就可以调用WebService。

おすすめ

転載: www.cnblogs.com/susanhonly/p/11937151.html