RIA作为一个互联网领域越来越火的术语,究其根本在于它相对传统Web应用的诸多优势。RIA作为“富互联网应用”的代名词(Rich Internet Application),从名字上就已经可以看出它最大的特点:Rich,这个Rich是多方面的,包括丰富的表现力、富有交互、内容丰富、基于富客户端引擎等等。同时,RIA是Internet的,它在功能上希望和传统的Web应用一样通用、标准,因此,这也是为什么眼下很多2D/3D效果俱佳、操作人性化的网络游戏不能称为RIA的原因。
传统Web应用的很多不足都来源于HTML的静态性,虽然由于JavaScript脚本的存在可以在浏览器中实现一些客户端交互和效果;同时,Web2.0浪潮推广的AJAX技术也使浏览器和服务器的通讯更及时、页面表现也更友好。但是,传统Web的根基使这些进步都是局限的,在声音、视频、Socket通讯、本地存储这些方面它都捉襟见肘。
RIA则在某种程度上颠覆了传统Web应用的理念和设计。为了能提供客户端更优秀的表现和交互能力,RIA一般会在客户端添加一个引擎,这个引擎和Java虚拟机的作用很相似, RIA则会在这个引擎中运行所有编译过的脚本及相关的资源。通过这个引擎的中介作用,RIA就把传统Web应用中很多在服务器上执行的功能(比如输出页面)转移到了客户端。一方面减轻了服务器的压力,另一方面也提高了客户端的处理和交互能力。
通常,RIA一般会提供比较出色的表现能力,这也是RIA之所以被称为“Rich”的最重要原因。传统的Web页面即使通过JavaScript脚本的帮助也很难达到RIA能做到的页面效果和功能,特别是GIS领域,在用户有复杂交互、地图无缝平滑缩放等需求的时候,RIA的这个优势尤其突出。由于RIA在表现方面的特色,用户在RIA与传统Web站点之间能感到明显的体验上的差距,这是RIA受欢迎的重要因素之一。
另外值得一提的是RIA的标准性。传统Web应用在面向不同的的操作系统和浏览器的时候,呈现出的页面可能千差万别;RIA则不同,由于操作系统或浏览器中都会有一个客户端引擎来运行我们的RIA,因此在各种支持的操作系统和浏览器中都没有差别,也就是说,你设计好的RIA在各种环境下表现地都会很标准。
总的来说,RIA相比传统Web应用的优势主要集中在以下几点:
1. 表现力丰富
2. 网络效率高
3. 交互能力强
4. 面向操作系统和浏览器透明
5. 沙箱环境提供更可靠的安全性
6. 易于与现有系统集成
当然,RIA也并不是没有缺陷,它也有它的局限性。RIA的局限性主要在两方面:其一,是客户端引擎的下载和安装;其二,是目前难于做SEO。
事实上RIA的概念和若干年前的Java Applet很相似,但是Java Applet已经基本消亡,如今的RIA却突然火爆,这和RIA的缺陷在目前得到某种程度的补偿有关系。
首先,客户端引擎的下载和安装。比如Flex,由于Flash在互联网的应用极其普遍,其赖以生存的Flash Player在各种系统的占有率在97%左右;Silverlight则估计会随着下一版本操作系统的推广成为将来Windows用户的标准配置,因此,客户端引擎对它们来说都不是很大的障碍。
而对于搜索引擎优化,一方面,只有面向公众的网站对这方面要求比较高,其它业务型的企业级应用则并不很关心,即使关心也可以把一些无需被搜索的内容放到RIA中(比如地图),而在Web页面中保留需要被搜索的内容;另一方面,Google等搜索引擎也正在和Adobe等公司进行深入合作,将RIA中内容的索引提上了日程,可以看到,RIA的迅猛发展使搜索引擎也开始关注这块重要领地了。
Flex 无疑是目前最为流行的RIA技术,这主要得益于Flash的风行。从Web出现不久的时候,网页制作工具就有“三剑客”的称谓,其中一个就是Flash。
Flash是为动画美工准备的工具,理论上讲用Flash也可以做出Flex能做的东西;但是为了拉拢众多的程序员参与RIA开发,在Flash的基础上出现了Flex,Flex工具最终出厂的产品也是Flash(.swf),但是整个开发流程则完全是程序开发模式的。
Flex的开发平台有Adobe的Flex Builder(基于Eclipse,$300),开源的FlashDevelop等。
Silverlight 是Microsoft在RIA领域的重大动作,很多人将其视为Flex的主要竞争对手,它吸取了很多Flex的优点,同时又和Visual Studio等工具进行了完美的结合,因此对于习惯Microsoft产品线的开发人员来说,Silverlight的开发环境和理念都是比较容易接受的。
Silverlight目前的版本是Silverlight 3 Beta。
JavaFX 是Sun公司推出的RIA平台,2008年底发布了第一个正式版本,目的和Silverlight一样——争夺目前被Flex/Flash牢牢占据的RIA市场。但目前为止,JavaFX还没有表现出可以与Flex/Flash甚至Silverlight一较高下的态势。另外,Sun被Oracle收购以后,这些产品线将何去何从也是一个未知数。
Curl 是一个试图在企业级RIA领域与Flex/Flash一较高下的平台,它是Curl公司的主打产品。Curl在部署的时候需要一个许可,对于商业应用来说,Curl要求的商业许可相当昂贵。另外,Curl的运行环境目前还没有普及,对于没有把握让用户先耐心把Curl RTE(运行环境)下载并安装上的应用,使用Curl一定要谨慎。
ArcGIS在RIA领域目前有Flex和Silverlight两种API,这两种API的工作基础都是ArcGIS Server的REST接口(REST SDK)。因此,下面我们对REST和ArcGIS Server的REST接口做些介绍。
REST(Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。REST本身并不涉及任何新的技术,它基于HTTP协议,比起SOAP和XML-RPC来说它更加地简洁、高效,越来越多的大型网站正在使用REST风格来设计和实现。
REST最突出的特点就是用URI来描述互联网上所有的资源,Roy Fielding博士通过观察互联网的运作方式对其进行了抽象,他认为:设计良好的网络应用表现为一系列的虚拟“网页”,或者说这些虚拟网页就是资源状态的表现(Representational);用户选择这些链接导致下一个虚拟的“网页”传输到用户端展现给使用的人,而这正代表了资源状态的转变(State Transfer)。
REST主要有以下的特点:
l 资源通过URI来指定和操作
l 对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法
l 连接是无状态性的
l 能够利用Cache机制来提高性能
ArcGIS Server原生地支持REST,也就是说在安装完ArcGIS Server后REST接口已经存在。
使用REST接口最重要的就是REST服务目录,它是将ArcGIS Server提供的REST资源通过HTML表现出来的URL。Java版本的在浏览器中访问http://:8399/argis/rest;.Net版本访问http:///arcgis/rest 就可以看到当前所有的服务及其这些服务超链接到的资源和操作。
图 1 ArcGIS Server REST服务目录
在这里顺便提一下使用REST接口的一个特别需要注意的地方,或许你有时新发布了一个服务,然后随即进入REST服务目录查看,但是却看不到这个服务。这是由于REST的缓存机制造成的,你需要去清空一下旧的缓存,方法就是进入REST管理界面http://[:8399]/arcgis/rest/admin,然后使用ArcGIS Server管理员帐号登录:
图 2 ArcGIS Server REST管理界面登录
登录后,在“Clear Cache Options”链接中可以对旧的REST缓存进行清除:
图 3 清除ArcGIS Server REST缓存
下面让我们看一下我在ArcGIS Server for Java服务器的“AgsSample”目录下发布的一个名为“World”的世界地图服务,在REST服务目录中,通过链接最终进入这个服务,这个链接应该是类似这样的格式(注意URL中的“rest”):http://localhost:8399/arcgis/rest/services/AgsSample/World/MapServer 。下面我们可以看到关于这个服务的信息和相关的操作:
图 4 ArcGIS Server地图服务的REST信息
下面就让我们点击“Export Map”链接去使用地图服务的“export”操作。你会发现,这个操作的URL是这样的:http://localhost:8399/arcgis/rest/services/AgsSample/World/MapServer/export?bbox=-198.000000454545,-99.0000004545455,198.000009545455,99.0000095454545 。在浏览器中访问这个URL的结果如下:
图 5 ArcGIS Server地图服务REST接口中的export操作
从这里你也可以总结出来:在ArcGIS Server REST接口中,请求服务的URL一般应该是这样的:http://[:]/arcgis/rest/services/<服务>/<服务类型>/<操作>?<参数>。关于REST接口支持的资源类型和具体操作参数,你可以查阅ArcGIS Server的REST SDK文档,在这里就不赘述了。