zoukankan      html  css  js  c++  java
  • webservice

    1、SOA:Service-Oriented Architecture   所以webservice只是SOA的一种实现

    2、webservice    指SOAP和restful

    3、SOAP详解

         http://blog.csdn.net/pan_tian/article/details/10008893

    SOA和Web Service

    首先明白SOA和Web Service的关系:
    * SOA面向服务架构,用于大型分布式系统的一个概念;
    * Web Service是实现SOA的方式之一,不是所有的SOA都是基于Web service的;
    * 但Webservice确实为最主流的SOA实现方式,有的人甚至把SOA等同于Webservice。不可否认,正是Webservice的成功才造就了SOA这个概念的成功;
     

    Webservice

    Webservice有三个基础标准:

    1.WSDL: Web服务定义语言(Web Service Definition Language),用来定义服务接口。实际上,它能描述服务的两个不同方面:服务的签名(名字和参数),以及服务的绑定和部署细节(协议和位置)。
    2.SOAP:简单对象访问协议(Simple Object Access Protocol),是定义Webservice的协议。HTTP是一个网络数据交互的底层协议,而SOAP是Web Service数据交换的专用协议。
    3.UDDI:通用描述、发现与集成服务(Universal Description, Discovery and Integration),UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
    SOAP是协议,就像HTTP协议一样,一般框架都已经集成;
    UDDI扮演者补充的角色,非必须,而且通常在实践中也不用。
    WSDL是开发人员打交道最多的东西,也算是Webservice的核心了。

    WSDL

    WSDL现在主要有两个版本,1.1和2.0,两个版本标示大体结构相似,略有不同。(WSDL1.1版本根节点为definitions,2.0版本根节点为description)
     
     
     
     
    WSDL Example
    WSDL通常是框架来生成的,并不是手工写的,比如Java可以使用wsgen 生成webservice,.Net框架也有自己方法,都可以通过自身的框架把接口发布称WSDL文件。
    一个WSDL的简单示例。这个WSDL文件定义了一个被称为CustomerService的服务,该服务提供了一个被称为getCustomerAdress()的操作。这个操作的输入参数为一个类型为long的客户ID,输出为一个包含3个string属性-街道、城市和邮编的结构。(示例来自于《SOA实践指南》)
    [html] view plain copy
     
     print?
    1. <?xml version="1.0" encoding="utf-8" ?>  
    2. <definitions name="CustomerService"  
    3.      targetNamespace="http://soa-in-practice.com/wsdl"  
    4.      xmlns:tns="http://soa-in-practice.com/wsdl"  
    5.      xmlns:xsd1="http://soa-in-practice.com/xsd"  
    6.      xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
    7.      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
    8.      xmlns="http://schemas.xmlsoap.org/wsdl/">  
    9.   
    10.      <types>  
    11.           <xsd:schema  
    12.                targetNamespace="http://soa-in-practice.com/xsd"  
    13.                xmlns="http://soa-in-practice.com/xsd">  
    14.   
    15.                <xsd:element name="getCustomerAddress">  
    16.                     <xsd:complexType>  
    17.                          <xsd:sequence>  
    18.                               <xsd:element name="customerID" type="xsd:long"/>  
    19.                          </xsd:sequence>  
    20.                     </xsd:complexType>  
    21.                </xsd:element>  
    22.   
    23.                <xsd:element name="getCustomerAddressResponse" type="Address"/>  
    24.                <xsd:complexType name="Address">  
    25.                     <xsd:sequence>  
    26.                          <xsd:element name="street" type="xsd:string"/>  
    27.                          <xsd:element name="city" type="xsd:string"/>  
    28.                          <xsd:element name="zipCode" type="xsd:string"/>  
    29.                     </xsd:sequence>  
    30.                </xsd:complexType>  
    31.   
    32.           </xsd:schema>  
    33.      </types>  
    34.   
    35.      <message name="getCustomerAddressInput">  
    36.           <part name="params" element="xsd1:getCustomerAddress"/>  
    37.      </message>  
    38.      <message name="getCustomerAddressOutput">  
    39.           <part name="params" element="xsd1:getCustomerAddressResponse"/>  
    40.      </message>  
    41.   
    42.      <portType name="CustomerInterface" >  
    43.           <operation name="getCustomerAddress">  
    44.                <input message="tns:getCustomerAddressInput" />  
    45.                <output message="tns:getCustomerAddressOutput" />  
    46.           </operation>  
    47.      </portType>  
    48.   
    49.      <binding name="CustomerSOAPBinding"  
    50.           type="tns:CustomerInterface" >  
    51.           <soap:binding style="document"  
    52.           transport="http://schemas.xmlsoap.org/soap/http" />  
    53.           <operation name="getCustomerAddress">  
    54.                <soap:operation  
    55.                soapAction="http://soa-in-practice.com/getCustomerAddress" />  
    56.                <input>  
    57.                     <soap:body use="literal" />  
    58.                </input>  
    59.                <output>  
    60.                     <soap:body use="literal" />  
    61.                </output>  
    62.           </operation>  
    63.      </binding>  
    64.   
    65.      <service name="CustomerService" >  
    66.           <port name="CustomerPort"  
    67.                binding="tns:CustomerSOAPBinding">  
    68.                <soap:address  
    69.                location="http://soa-in-practice.com/customer11"/>  
    70.           </port>  
    71.      </service>  
    72.   
    73. </definitions>  
    WSDL文件的解读
    阅读一个WSDL,需要从下往上看
    最后的<service>节点定义了这个服务的名称为CustomerService,并且该服务可以在http://soa-in-practice.com/customer11找到。
         <service name="CustomerService" >
              <port name="CustomerPort"
                   binding="tns:CustomerSOAPBinding">
                   <soap:address
                   location="http://soa-in-practice.com/customer11"/>
              </port>
         </service>
     
    <binding>节点定义了用来提供Webservice的协议和格式。CustomerSOABiding是Binding的名称,并指出Binding要从哪个接口开始(这里是从CustomerInterface这个接口开始)
         <binding name="CustomerSOAPBinding"
              type="tns:CustomerInterface" >
              <soap:binding style="document"
              transport="http://schemas.xmlsoap.org/soap/http" />
              <operation name="getCustomerAddress">
                   <soap:operation
                   soapAction="http://soa-in-practice.com/getCustomerAddress" />
                   <input>
                        <soap:body use="literal" />
                   </input>
                   <output>
                        <soap:body use="literal" />
                   </output>
              </operation>
         </binding>
     
    <portType>描述了CustomerInterface这个接口,其中接口包含一个叫getCustomerAddress的Operation。在Operation下边,getCustomerAddressInput和getCustomerAddressOutput是这个Operation的输入消息和输出消息。
         <portType name="CustomerInterface" >
              <operation name="getCustomerAddress">
                   <input message="tns:getCustomerAddressInput" />
                   <output message="tns:getCustomerAddressOutput" />
              </operation>
         </portType>
     
    <message>节点定义了各个消息,使用的是<portType>节点引用的标识符。
         <message name="getCustomerAddressInput">
              <part name="params" element="xsd1:getCustomerAddress"/>
         </message>
         <message name="getCustomerAddressOutput">
              <part name="params" element="xsd1:getCustomerAddressResponse"/>
         </message>
     
    <type>节点定义了将会使用到的数据类型:输入参数customerID的类型为long,输出参数address的类型是有3个字符串属性的结构/记录。所有类型在自己的命名空间xsd1中。
         <types>
              <xsd:schema
                   targetNamespace="http://soa-in-practice.com/xsd"
                   xmlns="http://soa-in-practice.com/xsd">

                   <xsd:element name="getCustomerAddress">
                        <xsd:complexType>
                             <xsd:sequence>
                                  <xsd:element name="customerID" type="xsd:long"/>
                             </xsd:sequence>
                        </xsd:complexType>
                   </xsd:element>

                   <xsd:element name="getCustomerAddressResponse" type="Address"/>
                   <xsd:complexType name="Address">
                        <xsd:sequence>
                             <xsd:element name="street" type="xsd:string"/>
                             <xsd:element name="city" type="xsd:string"/>
                             <xsd:element name="zipCode" type="xsd:string"/>
                        </xsd:sequence>
                   </xsd:complexType>

              </xsd:schema>
         </types>

    SOAP

     SOAP (Simple Object Access Protocol)是一个消息框架,这个消息框架是基于XML协议的,从下图能够看到,SOAP的框架非常像HTTP协议,都包含的消息的Header和消息的Body,只不过SOAP是Web Service数据交换的专用协议。SOAP是HTTP的上层协议,最终还是通过HTTP来传输数据。
     
    SOAP Reqeust Example
    [html] view plain copy
     
     print?
    1. <?xml version='1.0' ?>  
    2. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    3.      <soap:Header>  
    4.           ...  
    5.      </soap:Header>  
    6.      <soap:Body>  
    7.           <getCustomerAddress xmlns="http://soa-in-practice.com/xsd">  
    8.                <customerID>12345678</customerID>  
    9.           </getCustomerAddress >  
    10.      </soap:Body>  
    11. </soap:Envelope>  
    SOAP Response Example
    [html] view plain copy
     
     print?
    1. <?xml version='1.0' ?>  
    2. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    3.      <soap:Header>  
    4.           ...  
    5.      </soap:Header>  
    6.      <soap:Body>  
    7.           <getCustomerAddressResponse xmlns="http://soa-in-practice.com/xsd">  
    8.                <address>  
    9.                     <street>Gaussstr. 29</street>  
    10.                     <city>Braunschweig</city>  
    11.                     <zipCode>D-38106</zipCode>  
    12.                </address>  
    13.           </getCustomerAddressResponse>  
    14.      </soap:Body>  
    15. </soap:Envelope>  
    SOAP消息的根元素为<Envelope>
    从上边可以看出SOAP是基于XML的,除了组织结构,其他非常类似于HTTP的Request和Response。
     
    SOAP 1.2可以以http为基础,也可以运行在其他协议之上 

    发送
    POST /DEMOWebServices2.8/Service.asmx HTTP/1.1
    Host: api.efxnow.com
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Body>
    <CancelOrder xmlns="https://api.efxnow.com/webservices2.3">
    <UserID>string</UserID>
    <PWD>string</PWD>
    <OrderConfirmation>string</OrderConfirmation>
    </CancelOrder>
    </soap12:Body>
    </soap12:Envelope>
    回复
    HTTP/1.1 200 OK
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Body>
    <CancelOrderResponse xmlns="https://api.efxnow.com/webservices2.3">
    <CancelOrderResult>
    <Success>boolean</Success>
    <ErrorDescription>string</ErrorDescription>
    <ErrorNumber>int</ErrorNumber>
    <CustomerOrderReference>long</CustomerOrderReference>
    <OrderConfirmation>string</OrderConfirmation>
    <CustomerDealRef>string</CustomerDealRef>
    </CancelOrderResult>
    </CancelOrderResponse>
    </soap12:Body>
    </soap12:Envelope>
  • 相关阅读:
    Centos常用快捷键
    ngnix笔记
    转载申明
    Linux 最小安装常用包
    update-alternatives关键解疑
    使用Java语言开发机器学习框架和参数服务器
    storm实践
    JVM线程状态,park, wait, sleep, interrupt, yeild 对比
    PHP版本解密openrtb中的价格
    Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5402375.html
Copyright © 2011-2022 走看看