SuperMap iServer 的 REST 服务内部工作主要分为验证、解析 HTTP、请求处理以及结果编排返回几个过程,这些过程分别由 REST 服务内部的认证管理器、资源、参数解析器、资源 HTTP 处理器、表述生成器完成,客户端向 REST 服务提交的请求分别经由这些组成部分处理,最终形成处理结果返回给客户端,如图 1 所示。
图 1 REST 服务内部组件工作机制
资源
资源是 REST 服务核心的部分,SuperMap iServer 的 REST 服务中每一个资源都有唯一的 URI 地址,用户访问资源的 URI,并通过 HTTP 的五种动作(GET、PUT、POST、DELETE、HEAD)对资源进行操作,来获取各种 GIS 功能的操作结果。如对 layer 资源执行 put 操作表示创建或修改一个图层。
资源作为服务的核心元素,主要负责对 HTTP 请求内容进行处理。具体工作内容如下:
-
对参数对象的内容进行判断,对于非法参数直接返回异常的响应码。
-
通过 SuperMap iServer 服务内核- GIS 组件处理请求内容。
-
返回处理结果,包括当前地图状态参数等。
说明:SuperMap iServer 的 REST 服务除了提供各种默认的资源,如 maps 资源、layer 资源等,还开放了几个资源的抽象类,包括 AlgorithmResultResource, AlgorithmResultSetResource, SimpleAlgorithmResultResourceBase, StaticResource, CatalogListResourceBase, AsynchronizedResource, ResourceBase。如果 SuperMap iServer 提供的各种默认资源无法满足用户的特定功能的需求,可以通过对上述抽象基类进行扩展来实现特定功能的资源。
认证器
REST 服务是基于网络的,任何客户端通过 URI 都可以访问 REST 服务的各种类型的资源,甚至有些资源支持客户端对 GIS 数据进行编辑操作,因此必须在 REST 服务器端设置安全机制,用于保护 GIS 数据、保证 REST 服务不被恶意破坏。
SuperMap iServer REST 服务在安全机制环节专门设置了认证器,认证器是客户端请求到达 REST 服务后首先执行的程序,认证器主要作用是对客户端的身份进行合法性验证,只有通过身份验证的客户端请求才能够与 REST 服务进行交互,对于非法身份的客户端将其提交的请求驳回,认证器能够有效保证 REST 服务的安全。
SuperMap iServer 提供一个默认认证器,该认证器是由类 com.supermap.services.rest.HTTPBasicAuthorizer 来实现认证过程的。用户可以在 SuperMap iServer 安装目录的 webapps\iserver\WEB-INF\lib\iserver-all-{version}.jar 中获取该类。默认认证器负责如下工作:
-
获取标准身份的列表。
-
身份校对的标准被存储在 SuperMap iServer 安装目录的 webapps\iserver\WEB-INF\lib\iserver-all-{version}.jar 的 config\rest 下 password.properties 文件中,用户可以向该文件中添加多个可以访问 REST 服务的合法身份信息,其格式为[用户名]=[密码],例如 “iServer=iServer123!”表示一个名为“iServer”的用户,其密码是“iServer123!”。
默认认证器通过读取 password.properties 文件从而获得可以访问 REST 服务的身份列表。
-
解析客户端输入的身份信息。默认认证器解析客户端传入的身份验证的信息。
-
进行身份验证。默认认证器将解析的客户端传入的身份信息与身份列表的信息进行对比,如果身份列表中有匹配的用户,那么将该客户端请求转给资源。反之,认证器生成一个响应码用于说明客户端提交的身份不合法,并将响应码返回给客户端。
图 2 默认认证器工作流程
说明:SuperMap iServer 提供给用户的是一个默认的认证器,如果用户对于认证条件、认证方式有特殊的需求,可以通过扩展默认认证器的类 com.supermap.services.rest.HTTPBasicAuthorizer,重新将特定的认证方式写入认证器中。
参数解析器
参数解析器是用来解析包含在资源请求中的地图参数,将参数反序列化,转换为参数对象,以便 REST 服务根据参数对象执行对应的 GIS 处理。
例如某客户端对 area 资源提交 GET 请求,请求计算地图的面积。这时 area 资源需要客户端同时提交必要的计算参数,即提交要量算的区域的节点坐标。而且 REST 服务规定这些必要的计算参数需要包含在资源的 URI 中,那么对 area 资源提交 GET 请求为:
http://localhost:8090/iserver/services/map-world/rest/maps/World Map/area.rjson?point2Ds= [{"x": 23.00,"y":34.00},{"x": 53.55,"y":12.66},{"x": 73.88,"y":12.6}]&unit=METER
其中 point2Ds= [{"x": 23.00,"y":34.00},{"x": 53.55,"y":12.66},{"x": 73.88,"y":12.6}]&unit=METER 就是资源计算所需要的参数部分。REST 服务端获取到该请求后,参数解析器将 URI 中相关的计算参数反序列化转换为参数对象,这样 REST 资源进行 GIS 处理就可以根据参数对象中的各个属性值来执行操作。
SuperMap iServer 提供一个参数解析器的抽象基类- com.supermap.services.rest.decoders.Decoder 方便用户对参数解析器进行扩展。同时提供一个 Json 表述的参数解析器 - com.supermap.services.rest.decoders.JsonDecoder 和一个 xml 表述的参数解析器 - com.supermap.services.rest.decoders.XMLDecoder,这两类参数解析器实现两种不同表述类型的参数解析的过程。用户可以在 SuperMap iServer 安装目录的 webapps\iserver\WEB-INF\lib\iserver-all-{version}.jar 中获取这些类。
说明:用户可以对参数解析器进行扩展开发,实现自定义的参数解析方法。通常当用户向 REST 服务添加了一个自定义资源,并且该资源的参数解析规则具有特殊性时,可以利用扩展参数解析器来实现对特殊参数的解析处理工作。
HTTP 处理器
HTTP 处理器是 REST 资源用于处理 HTTP 请求的入口与出口。客户端的请求经过认证器的校验后被分配给相应的资源,此时 HTTP 处理器获取 HTTP 请求,对 HTTP 请求进行判读与处理,最后将最终资源表述返回给客户端。
SuperMap iServer 提供默认 HTTP 处理器 - com.supermap.services.rest.DefaultMethodHandler,用户可以在 SuperMap iServer 安装目录的 webapps\iserver\WEB-INF\lib\iserver-all-{version}.jar 中获取这个类,该类主要由 HandleGET、HandlePOST、HandlePUT、HandleDELETE、HandleHEAD、HandleOptions 几个方法分别负责 HTTP 的动作处理。该处理器主要为 SuperMap iServer 的地图资源、数据资源、空间分析资源以及三维资源提供 HTTP 请求的处理工作。它主要负责如下工作内容:
- 取得客户端 HTTP 请求。
- 判读 HTTP 请求的资源是否存在。如果 HTTP 请求的资源不存在,将资源不存在的响应码返回给客户端。
- 判读 HTTP 请求的动作 REST 资源是否支持。在 SuperMap iServer 中每个资源都有其能够处理的动作,如果 HTTP 请求的动作资源无法处理,HTTP 处理器会给客户端返回无法处理动作的响应码。
- 判断 HTTP 请求返回的表述类型 REST 资源是否支持。通常 REST 资源支持多种表述格式,包括 json、xml、html、rjson、png、bmp、gif、jpg 等。如果 HTTP 请求返回的表述类型资源无法支持,那么 HTTP 处理器会给客户端返回不支持表述类型的响应码。
- 调用参数解析器解析 HTTP 请求的参数,转换为资源需要的参数对象。
- 向资源提交参数对象并获取资源处理的结果。
- 调用表述生成器,将处理结果生成所需的表述格式。
- 将表述返回客户端。
说明:对于 HTTP 请求的处理与响应的工作流程并不是固定不变的,不同的用户针对不同的业务需求可能需要某些特殊的处理机制,因此 SuperMap iServer 提供 HTTP 处理器的抽象基类 - com.supermap.services.rest.AbstractMethodHandler,上述的默认 HTTP 处理器(DefalutMethodHandler)就是该抽象基类的一个扩展类。用户可以继承 HTTP 处理器的抽象基类开发自定义的 HTTP 处理器。
表述生成器
表述生成器是将资源的处理结果生成指定类型的表述的一类程序。
在 REST 服务模式中,资源将客户端请求的响应结果以表述的形式返回给客户端。客户端执行 GET 请求,将会获得对资源的表述;客户端执行 PUT、POST、DELETE 请求,将获得操作结果的表述。目前 SuperMap iServer 的资源支持的表述有多种格式,如 html、xml、json、rjson、png、bmp、gif 、jpg 或 jpeg 等,其中 png、bmp、gif、jpg 或 jpeg 是图片资源特有的表述格式。以下为 maps 服务的 XML 表述:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><list>
<ChildResource>
<name>世界地图_Day</name>
<resourceType>StaticResource</resourceType>
<resourceConfigID>map</resourceConfigID>
<path>http://supermapiserver:8090/iserver/services/maps/rest/maps/
%E4%B8%96%E7%95%8C%E5%9C%B0%E5%9B%BE_Day</path>
<supportedMediaTypes>
<string>application/xml</string>
<string>text/xml</string>
<string>application/json</string>
<string>application/rjson</string>
<string>text/html</string>
<string>application/jsonp</string>
<string>application/x-java-serialized-object</string>
<string>application/ajax</string>
<string>application/silverlight</string>
<string>application/flex</string>
<string>application/kml</string>
<string>application/openlayers</string>
</supportedMediaTypes>
</ChildResource>
<ChildResource>
<name>世界地图</name>
<resourceType>StaticResource</resourceType>
<resourceConfigID>map</resourceConfigID>
<path>http://supermapiserver:8090/iserver/services/maps/rest/maps/
%E4%B8%96%E7%95%8C%E5%9C%B0%E5%9B%BE</path>
<supportedMediaTypes>
<string>application/xml</string>
<string>text/xml</string>
<string>application/json</string>
<string>application/rjson</string>
<string>text/html</string>
<string>application/jsonp</string>
<string>application/x-java-serialized-object</string>
<string>application/ajax</string>
<string>application/silverlight</string>
<string>application/flex</string>
<string>application/kml</string>
<string>application/openlayers</string>
</supportedMediaTypes>
</ChildResource>
<ChildResource>
<name>世界地图_Night</name>
<resourceType>StaticResource</resourceType>
<resourceConfigID>map</resourceConfigID>
<path>http://supermapiserver:8090/iserver/services/maps/rest/maps/
%E4%B8%96%E7%95%8C%E5%9C%B0%E5%9B%BE_Night</path>
<supportedMediaTypes>
<string>application/xml</string>
<string>text/xml</string>
<string>application/json</string>
<string>application/rjson</string>
<string>text/html</string>
<string>application/jsonp</string>
<string>application/x-java-serialized-object</string>
<string>application/ajax</string>
<string>application/silverlight</string>
<string>application/flex</string>
<string>application/kml</string>
<string>application/openlayers</string>
</supportedMediaTypes>
</ChildResource>
<ChildResource>
<name>World Map</name>
<resourceType>StaticResource</resourceType>
<resourceConfigID>map</resourceConfigID>
<path>http://supermapiserver:8090/iserver/services/maps/rest/maps/World+Map</path>
<supportedMediaTypes>
<string>application/xml</string>
<string>text/xml</string>
<string>application/json</string>
<string>application/rjson</string>
<string>text/html</string>
<string>application/jsonp</string>
<string>application/x-java-serialized-object</string>
<string>application/ajax</string>
<string>application/silverlight</string>
<string>application/flex</string>
<string>application/kml</string>
<string>application/openlayers</string>
</supportedMediaTypes>
</ChildResource>
<ChildResource>
<name>长春市区图</name>
<resourceType>StaticResource</resourceType>
<resourceConfigID>map</resourceConfigID>
<path>http://supermapiserver:8090/iserver/services/maps/rest/maps/
%E9%95%BF%E6%98%A5%E5%B8%82%E5%8C%BA%E5%9B%BE</path>
<supportedMediaTypes>
<string>application/xml</string>
<string>text/xml</string>
<string>application/json</string>
<string>application/rjson</string>
<string>text/html</string>
<string>application/jsonp</string>
<string>application/x-java-serialized-object</string>
<string>application/ajax</string>
<string>application/silverlight</string>
<string>application/flex</string>
<string>application/kml</string>
<string>application/openlayers</string>
</supportedMediaTypes>
</ChildResource>
</list>
不同类型的表述由不同的表述生成器实现,目前 SuperMap iServer 提供图片表述生成器( com.supermap.services.rest.encoders.ImageEncoder,主要用于生成 BMP、PNG、JPEG 等格式的表述),JSON 表述生成器(com.supermap.services.rest.encoders.JsonEncoder,主要用于生成 JSON 格式的表述),RJson 表述生成器(com.supermap.services.rest.encoders.RJsonEncoder,主要用于生成 RJSON 格式的表述),XML 表述生成器(com.supermap.services.rest.encoders.XMLEncoder,主要用于生成 XML 格式的表述),模板表述生成器(com.supermap.services.rest.encoders.TemplateEncoder,该生成器按照模板指定的格式生成表述,该模板可用户自定义设计,HTML 的表述就是基于该类生成的)。
表述的格式在 HTTP 请求的 URI 中指定,形式是在 URI 后面加上.<format>。例如 http://server:port/iserver/services/components-rest/rest/maps.json 执行 GET 请求,表述生成器会生成 json 格式的 maps 资源的表述。
如果不指定<format>,表述生成器以默认的表述格式生成相应表述。对于 GET 请求,默认返回 html 格式的表述;而对于 PUT、POST 和 DELETE 请求,默认返回 rjson 格式的表述。
说明:
- 如果获取图片资源的表述出错,对于 Debug 模式(在 AppContext.xml 中 REST 配置项的 debug 字段为 true 表示为 Debug 模式),出错信息以 html 格式返回,否则以 json 格式返回。
- SuperMap iServer 当前提供的表述类型不能满足用户的需求,用户可以通过对表述生成器的抽象基类(com.supermap.services.rest.encoders.Encoder)进行扩展,开发适合自身需求的表述生成器。