Web Service的开发与应用基础

时间:2024-07-12 13:13:55 Web Services 我要投稿
  • 相关推荐

Web Service的开发与应用基础

  Web Service基于SOAP协议,而SOAP本身符合XML语法规范。虽然.NET为Web Service提供了强大的支持,但了解其基本机制对于程序员来说仍然是必需的。

  1.1 神马是SOAP协议?

  SOAP协议的全称是简单对象访问协议(Simple Object Access Protocol),SOAP致力于以XML形式提供一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。SOAP只规范对象访问的方式,而不限制具体实现的技术环境,这意味着SOAP协议是一种跨平台的协议:一个.NET客户端程序可以按照SOAP协议访问一个基于JavaEE技术体系结构的Web Service。SOAP访问仍然基于HTTP协议,同时其内容又以XML形式展现。

  SOAP规范由四部分组成:

  ① SOAP信封(SOAP envelop)

  ② SOAP编码规则(SOAP encoding rules)

  ③ SOAP RPC表示(SOAP RPC representation)

  ④ SOAP绑定(SOAP binding)

  这里不对这四部分展开介绍,通过下面的一个小例子来直观地认识一下。

  (1)在Web服务端,打算对外提供一个公共方法来供客户端调用,而客户端则需要提供这个方法需要的参数,并且最终得到返回值。假设这个方法被申明在MySimpleService.asmx文件中:

  [WebMethod]

  public string GetSumString(int para1, int para2)

  {

  int result = para1 + para2;

  return result.ToString();

  }

  (2)当客户端试图使用这个Web Service方法时,就需要向服务器端发出这样的一个HTTP请求:

  POST /MySimpleService.asmx HTTP/1.1

  Host: localhost

  Content-Type: text/xml; charset=utf-8

  Content-Length: length

  SOAPAction: "http://tempuri.org/GetSumString"

  <?xml version="1.0" encoding="utf-8"?>

  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Body>

  <GetSumString xmlns="http://tempuri.org/">

  <para1>250</para1>

  <para2>250</para2>

  </GetSumString>

  </soap:Body>

  </soap:Envelope>

  (3)等到Web Service服务器端接收到上面的请求之后,就可以进行相应的逻辑处理,并且返回结果。根据SOAP协议,HTTP响应如下形式:

  HTTP/1.1 200 OK

  Content-Type: text/xml; charset=utf-8

  Content-Length: length

  <?xml version="1.0" encoding="utf-8"?>

  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Body>

  <GetSumStringResponse xmlns="http://tempuri.org/">

  <GetSumStringResult>500</GetSumStringResult>

  </GetSumStringResponse>

  </soap:Body>

  </soap:Envelope>

  如此一来,客户端就得到了服务端的处理结果,换句话说,客户端已经得到了Web Service提供的服务。

  PS:最后,再说一下SOAP协议和HTTP协议,它们的关系非常类似于网络分层中的上下层协议,使用SOAP协议的双方将SOAP数据包放入HTTP报文之中,并且通过HTTP协议完成实际的传输,换句话说,SOAP是对HTTP的一个封装,下图说明了这一过程:

  1.2 WSDL又是什么鬼,它有啥作用?

  (1)WSDL介绍

  WSDL(Web Service Description Language)是Web服务描述语言,它是一种由微软、IBM、Intel等大型供应商提出的语言规范,目的就是为了描述Web服务器所提供的服务,以供使用者参考。WSDL是一种复合XML语法规范的语言,它的设计完全基于SOAP协议,当一个Web Service服务器期望为使用者提供服务说明时,WSDL是最好的选择之一。

  这里仍以上面的实例来说明,在Web服务端提供了这样一个方法:

  string GetSumString(int para1, int para2)

  当服务端视图利用WSDL告诉客户端如何使用该方法时,就会提供下面的这样一个WSDL文件(仍然是一个XML):

  <?xml version="1.0" encoding="utf-8"?>

  <wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

  <wsdl:types>

  <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">

  <s:element name="GetSumString">

  <s:complexType>

  <s:sequence>

  <s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" />

  <s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" />

  </s:sequence>

  </s:complexType>

  </s:element>

  <s:element name="GetSumStringResponse">

  <s:complexType>

  <s:sequence>

  <s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" />

  </s:sequence>

  </s:complexType>

  </s:element>

  </s:schema>

  </wsdl:types>

  <wsdl:message name="GetSumStringSoapIn">

  <wsdl:part name="parameters" element="tns:GetSumString" />

  </wsdl:message>

  <wsdl:message name="GetSumStringSoapOut">

  <wsdl:part name="parameters" element="tns:GetSumStringResponse" />

  </wsdl:message>

  <!-- 这里省略其他定义 -->

  </wsdl:definitions>

  如上xml所示,在<wsdl:types>节点下,WSDL定义了GetSumString方法的名字:

  <s:element name="GetSumString">

  参数数量、每个参数的类型:

  <s:complexType>

  <s:sequence>

  <s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" />

  <s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" />

  </s:sequence>

  </s:complexType>

  以及返回参数的类型:

  <s:element name="GetSumStringResponse">

  <s:complexType>

  <s:sequence>

  <s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" />

  </s:sequence>

  </s:complexType>

  </s:element>

  通过完整的描述,使用者就能够了解如何使用该Web服务了。

  (2)获取和使用WSDL

  当Web Service服务器提供WSDL时,就可以通过特定的工具获得WSDL文件。最直接的方式就是在URL中直接添加WSDL参数,来发送得到WSDL文件的请求,如下所示:

  http://localhost:6105/MySimpleService.asmx?wsdl

  这时点击回车就可以得到如下图所示的WSDL结果:

  1.3 Web Service中如何处理附件?

  尽管Web Service提供的方法的参数类型没有任何限制,也就意味着所有的附件可以通过字节数组来进行传递,但是把字节流直接内嵌在SOAP消息的做法有很多问题,这也曾经成为XML语法和SOAP协议被诟病的原因。这里主要介绍一下XOP的概念。

  在XOP出现之前,SOAP处理二进制数据的方式都很简单,比如当一个Web Service服务端提供了如下的方法时:

  void UploadSmallAttach(Byte[] attachment)

  客户端调用该Web Service,只需要发出下面这样的SOAP请求即可:

  <?xml version="1.0" encoding="utf-8"?>

  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Body>

  <UploadSmallAttach xmlns="http://tempuri.org/">
  <attachment>D0CF11E0A1B11AE100000000000000000000000003E00003
00FEFF09000600000000000000000000000600000000000000000000
DE0200000000000000000000001000000000000000FEFFFFFFFF000
00000000000000000D80200000000000D9020000DA02000DB02000
000DC020000DD0200000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFF</attachment>

  </UploadSmallAttach>

  </soap:Body>

  </soap:Envelope>

  如上所示,其中<attachment>节点下的一大堆字符,就是某个文件的字节流。通过这种方式,确实是可以实现传送二进制附件的功能的,但这样的处理过于粗略,且传输没有任何优化。W3C为此特别指定了XOP规范。

  XOP(XML-binary Optimized Packages)意为XML二进制打包,它把二进制数据流从SOAP消息中分离出来,进行单独打包。上述的客户端请求如果使用XOP规范的话,将转变为如下结果:

  <?xml version="1.0" encoding="utf-8"?>

  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

  <soap:Body>

  <UploadSmallAttach xmlns="http://tempuri.org/">

  <attachment>

  <xop:Include xmlns="http://www.w3.org/2015/10/02/xop/include" href="cid:http://www.book.com/attachment.png" />

  </attachment>

  </UploadSmallAttach>

  </soap:Body>

  </soap:Envelope>

  可以看到,原本出现在二进制字节流的地方,被转换成了一个引用:

  <attachment>

  <xop:Include xmlns="http://www.w3.org/2015/10/02/xop/include" href="cid:http://www.book.com/attachment.png" />

  </attachment>

  这样整个SOAP信封节点下就不再包含任何二进制直接,而福建则被安放在另一个MIME体中:

  Content-Type: image/png

  Content-Transfer-Encoding: binary

  Content-ID: <sample@book.com>
  D0CF11E0A1B11AE100000000000000000000000003E0000300FEFF090006
00000000000000000000000600000000000000000000DE0200000000000
000000000001000000000000000FEFFFFFFFF00000000000000000000D8
0200000000000D9020000DA02000DB02000000DC020000DD020000000
0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

【Web Service的开发与应用基础】相关文章:

Web Workers加速移动Web应用03-30

web浏览创作效果精选03-29

Web 2.0技术的内容03-30

Web开发的教程图解03-30

web标准常见问题03-30

WEB教程标准应用标签03-30

基于web的综合测评与分析03-30

集成spring与Web容器教程03-20

关于java-web的试卷03-30