首页 > 代码库 > Web Service常识

Web Service常识

<script type="text/javascript" src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script><script type="text/javascript">//

‘; j+=‘
‘; j+=‘

目录(?)[+]

‘; j+=‘
    ‘; var g=0,f=0; for(var c=0;cg){ j+="
      ";f++ }else{ if(e0){ j+="
    ";f-- } } if(e==1){ while(f>0){ j+="
";f-- } } g=e; var b=d.eq(c).text().replace(/^[\d.、\s]+/g,""); b=b.replace(/[^a-zA-Z0-9_\-\s\u4e00-\u9fa5]+/g,""); if(b.length<100){ j+=‘
  • ‘+b+"
  • "; d.eq(c).html(‘‘+d.eq(c).html()) } } while(f>0){ j+="";f-- } j+="
    ";j+=‘
    ‘; $(j).insertBefore($("#article_content")) }); function openct(b){ if(b.innerHTML=="[+]"){ $(b).attr("title","收起").html("[-]").parent().next().show() } else{ $(b).attr("title","展开").html("[+]").parent().next().hide() }b.blur(); return false } // ]]></script>

    1 问题的引出

    位于服务器的程序需要在Web页面上显示一个订单列表,它需要访问业务对象服务器上的程序,通过它读取订单列表,业务对象服务器又要访问数据库服务器。当一台计算机上的程序调用另一台计算机上的程序时,就称之为一次远程过程调用(Remote Procedure Call)RPC。

    不同的组织定义了不同的RPC协议:

    (1)DCOM

    COM对象与语言无关,可以使用任何一种语言来设计COM对象,这些COM对象被设计用来被其他程序调用,但是COM对象必须和调用程序位于同一台计算机上。为此微软扩展了COM模型来解决这一问题。但是一个最严重的缺点就是,也是所有微软产品的通病:不能跨平台。

    (2)IIOP

    与DCOM的功能相同,与语言无关,并且支持跨平台(COM底层功能是由操作系统来提供的,所以不跨平台,而IIOP则是由对象请求代理ORB提供的)。

    但是DCOM和IIOP技术太复杂了,这大大影响了他们的推广。

    (3)Java RMI

    Java在诞生时就许诺“一次编译,到处运行”,并且Java为远程计算提供了远程方法调用或者RMI系统。比其他语言都省事,并且Java RMI还有一个特有的功能:每次调用时,可以转移代码,即,如果你准备调用的远程计算机上没有你需要的代码,可以把自己的代码传上去让远程计算机执行你的代码。它的缺点是,程序员只能使用Java语言了。

    那么有没有一种新的RPC继承它们的有点,但又克服它们的缺点呢?

    那就是Web Service技术分享技术分享技术分享

    2 Web Service

    2.1 Web Service定义

    一个Web服务是指接受一个请求,返回数据或执行一项处理活动。

    广义上讲的Web Service与一个XML Web Service不一样。这里主要讨论XML Web Service。

    2.2 XML Web Service的设计方法

    根据发送请求的方式的不同可以分为两种:

    XML-RPC:把方法名和参数封装在一个XML格式里;

    网络传输:这种方法只说明Web服务采用XML文档作为其输入参数,XML文档的格式是预先定义好的,通常才会用XML Schema模式,然后该服务处理文档并执行请求的任务。

    2.2.1 XML-RPC

    客户端向服务器发送一个编码成XML格式的命令,由它执行远程过程调用,并返回以编码为XML格式的响应。

    例如我们需要调用如下API接口程序:

    技术分享 struct topicExchange.getChannels()

    返回一个频道列表,不需要参数。

    技术分享 struct topicExchange.ping(string topicName,struct details)

    把新记录添加到topicName主题里。

    技术分享 struct topicExchange.getChannelInfo(string topicName)

    返回tiopcName频道的内容。

    下面我们就用XML-RPC方式请求调用方法:

    对于topicExchange.getChannels

    技术分享
    1 <methodCall>2     <methodName>topicExchange.getChannels</methodName>3 </methodCall>
    View Code

    这是一个最简单的请求了。

    对于topicExchange.ping,我们就需要传递参数过去了,该方法要求一个string参数和一个struct参数:

    技术分享

    我们注意到,参数值在传递时要注明它的类型,XML-RPC定义了7种标题类型:

    <int>(或者<i4>,表示4字节的带符号整数)、<boolean>(0代表假,1代表真)、<string>、<double>、<dateTime.iso8601>(日期/时间值)和<base64>(采用base64编码的二进制数)

    接下来看一个函数返回值:

    技术分享
     1 <methodResponse> 2     <params> 3         <param> 4             <value> 5                 <struct> 6                     <member> 7                         <name>books</name> 8                         <value> 9                             <struct>10                                 <member>11                                     <name>url</name>12                                     <value><string>http://www.baidu.com</string></value>13                                 </member>14                             </struct>                               15                         </value>16                     </member>17                     <member>18                         <!-- more -->19                     </member>20                 </struct>21             </value>22         </param>23     </params>24 </methodResponse>
    View Code

    由此可见,struct还可以嵌套。

    2.2.2 网络传输

    Web服务允许我们利用网络传输发送和接受消息。目前最常用的发送协议就是HTTP。

    HTTP包含两部分内容:消息头和消息体。它们之间有个空行。

    关于HTTP协议的介绍下面两篇文章介绍的非常详细,我们在此表示非常感谢技术分享技术分享

    HTTP协议详解(真的很经典)

    HTTP 协议详解

    这样我们便可以在XML-RPC中使用HTTP了。为此我们只需在客户端做两件事情:

    对于HTTP方法,是用POST模式;

    对于消息体,插入由XML-RPC请求组成的XML文档。如:

    技术分享

    消息头定义了请求内容,消息体由XML-RPC请求组成。服务器知道如何读取并处理消息体。

    Web Service常识