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

 <methodCall>
<methodName>topicExchange.getChannels</methodName>
</methodCall>

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

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

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

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

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

 <methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>books</name>
<value>
<struct>
<member>
<name>url</name>
<value><string>http://www.baidu.com</string></value>
</member>
</struct>
</value>
</member>
<member>
<!-- more -->
</member>
</struct>
</value>
</param>
</params>
</methodResponse>

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

2.2.2 网络传输

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

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

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

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

HTTP 协议详解

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

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

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

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

Web Service常识的更多相关文章

  1. .NET基础拾遗(7)Web Service的开发与应用基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  2. Web Service概念梳理

    计算机技术难理解的很多,Web Service 对我来说就是一个很难理解的概念:为了弄清它到底是什么,我花费了两周的时间,总算有了一些收获,参考了不少网上的资料,但有些概念说法不一.我以w3c和 一些 ...

  3. Web Service随笔

    什么是Web Service? WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络 ...

  4. 应用Apache Axis进行Web Service开发

    转自(http://tscjsj.blog.51cto.com/412451/84813) 一.概述 SOAP原意为Simple Object Access Protocol(简单对象访问协议),是一 ...

  5. Web Service

    Web Service全称XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP ...

  6. WCF、Web API、WCF REST、Web Service比较

    原文地址:http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and- ...

  7. Web Service和WCF的区别。其实二者不属于一个范畴!!!

    Web Service和WCF的区别 [1]Web Service:严格来说是行业标准,也就是Web Service 规范. 它有一套完成的规范体系标准,而且在持续不断的更新完善中. 它使用XML扩展 ...

  8. Web Service简要概念,学习记录!

    Web Service平台需要一套协议来实现分布式应用程序的创建.任何平台都有它的数据表示方法和类型系统.要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同平台.编程语 ...

  9. 使用axis开发web service服务端

    一.axis环境搭建 1.安装环境 JDK.Tomcat或Resin.eclipse等. 2.到 http://www.apache.org/dyn/closer.cgi/ws/axis/1_4下载A ...

随机推荐

  1. Activiti 查看流程图

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...

  2. 转:最简单的基于 DirectShow 的视频播放器

    50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...

  3. 推荐几款API文档集合工具

    https://zealdocs.org/    开源.免费,支持Linux.Windows http://velocity.silverlakesoftware.com/  https://kape ...

  4. Revit中如何添加水平仰视平面视图

    在Revit平面视图中视角是俯视视角,但是在一些特殊的情况下,我们可能需要创建仰视视角的平面视图,例如我们需要向上看天花板的灯具布置的时候,下面举例说明添加仰视平面视图的方法. 如图在模型中有一楼板跟 ...

  5. java中获取比毫秒更为精确的时间

    所以这里提醒做非常精确的时间统计的朋友,谨慎使用System.currentTimeMillis() . 在Java中可以通过System.currentTimeMillis()或者System.na ...

  6. tomcat7需要进行升级,因为有漏洞,而且安装包没有做过优化处理

    http://www.open-open.com/lib/view/open1401931407228.html http://www.cnblogs.com/ggjucheng/archive/20 ...

  7. supervisor监控gearman任务

    安装supervisor方法,可以直接用 yum install supervisord ,但是版本可能会旧一点,可以参考官方的方法: easy_install supervisor http://s ...

  8. 将复杂form表单序列化serialize-object.js

    <form class="form-horizontal" role="form" id="myform" action=" ...

  9. 太阳升起并下落的小动画-SWIFT

    一个小小的动画,太阳公公上山又下山.先上效果图. 用 lipecap 录的gif效果有点卡顿.好吧,说下如何实现的. 首先在一个大圆内先计算出内切九边形各个顶点的位置,接着连接相应的顶点变成一个九角星 ...

  10. 查看SqlAzure和SQLServer中的每个表数据行数

    SqlAzure中的方式: select t.name ,s.row_count from sys.tables t join sys.dm_db_partition_stats s ON t.obj ...