HTTP 处理器的基类介绍
在 SuperMap iServer 专门为 HTTP 处理器提供了一个抽象基类 - com.supermap.services.rest.AbstractMethodHandler,所有的 HTTP 请求处理器都继承自该类。SuperMap iServer 默认提供的 HTTP 请求处理器有 DefaultMethodHandler。
用户扩展 HTTP 请求处理器,需要继承 AbstractMethodHandler 抽象类,实现其中的抽象方法,或继承 DefaultMethodHandler,改写其中的方法。其中,重要的方法如下表所示:
方法名称 | 含义 |
handleGet(ResourceBase, Request, Response) | 使用目标资源处理 GET 请求。 |
handleHead(ResourceBase, Request, Response) | 使用目标资源处理 HEAD 请求。 |
handlePost(ResourceBase, Request, Response) | 使用目标资源处理 POST 请求。 |
handlePut(ResourceBase, Request, Response) | 使用目标资源处理 PUT 请求。 |
handleDelete(ResourceBase, Request, Response) | 使用目标资源处理 DELETE 请求。 |
handleOptions(ResourceBase, Request, Response) | 使用目标资源处理 OPTIONS 请求。 |
实例
作为实例,这里实现一个简单的 HTTP 请求处理器:MyMethodHandler,实际实现其中的 handleGET 方法,实现以下逻辑:
不再读取 HTTP 请求中,客户端期望的表述类型,对所有的 GET 请求,只返回 XML 格式的表述。
该实例代码位于【SuperMap iServer 安装根目录】/samples/code/ExtendREST 中。
第一步:根据设计实现代码,继承 AbstractMethodHandler 抽象类。
MyMethodHandler 继承于 AbstractMethodHandler 抽象类,其实现如下:
package com.supermap.sample.extendREST;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.representation.Representation;
import com.supermap.services.rest.AbstractMethodHandler;
import com.supermap.services.rest.encoders.Encoder;
import com.supermap.services.rest.encoders.XMLEncoder;
import com.supermap.services.rest.resources.ResourceBase;
public class MyMethodHandler extends AbstractMethodHandler {
@Override
public void handleGet(ResourceBase targetResource, Request request, Response response) {
// TODO Auto-generated method stub
Encoder encoder = null;
if (targetResource.isResourceExist()) {
//强制使用 XML 表述生成器。
encoder = new XMLEncoder();
Object content = targetResource.getResourceContent();
if (content != null) {
// 不管请求如何,都返回 XML 格式的资源的表示。
Representation entity = encoder.toRepresentation(MediaType.TEXT_XML, content);
response.setEntity(entity);
response.setStatus(Status.SUCCESS_OK);
} else {
// 资源没有表示。
response.setStatus(Status.SUCCESS_NO_CONTENT);
}
} else {
// 处理资源不存在异常。
response.setStatus(Status.CLIENT_ERROR_NOT_FOUND);
}
}
@Override
public void handleHead(ResourceBase arg0, Request arg1, Response arg2) {
// TODO Auto-generated method stub
}
@Override
public void handleOptions(ResourceBase arg0, Request arg1, Response arg2) {
// TODO Auto-generated method stub
}
@Override
public void handlePost(ResourceBase arg0, Request arg1, Response arg2) {
// TODO Auto-generated method stub
}
@Override
public void handlePut(ResourceBase arg0, Request arg1, Response arg2) {
// TODO Auto-generated method stub
}
@Override
public void handleDelete(ResourceBase arg0, Request arg1, Response arg2) {
}
}
第二步:编译 MyMethodHandler 类成 Jar 包,并将 Jar 包放到【安装根目录】/webapps/iserver/WEB-INF/lib 目录下,这里将它打进 extendREST.jar 中。
第三步:将自定义的 HTTP 请求处理器配置到 REST 服务。
配置方法与表述生成器扩展的配置方法类似,先注册成为 Bean 组件,然后再配置到单个资源或所有资源。
需要说明的是,配置到 Resources.xml 中的节点变成了 <extensionHttpActionHandlerBeanName/>,配置到所有资源,即配置 AppContext.xml 的<util:map id="restConfig"/>时,<entry/>变成了 key 值为 defaultHttpActionHandler 的<entry/>。
这里在 MyMethodHandler 注册成名为 MyHTTPHandler 的 Bean 组件后,将 MyHTTPHandler 配置到 maps 资源中,maps 资源的资源配置信息位于 %SuperMap iServer_HOME%/lib/iserver-all-{version}.jar/config/rest 下的 Resource.xml 中。如下所示:
<resource>
<configID>maps</configID>
<urlTemplate>/maps</urlTemplate>
<resourceType>CatalogList</resourceType>
<implementClass>com.supermap.services.rest.resources.impl.MapsResource</implementClass>
<extensionEncoderBeanNames></extensionEncoderBeanNames>
<extensionDecoderBeanNames></extensionDecoderBeanNames>
<extensionHttpActionHandlerBeanName>MyHTTPHandler</extensionHttpActionHandlerBeanName>
</resource>
注意,跟表述生成器、参数解析器略有不同的是,一个资源虽然可以有多个可用的表述生成器和参数解析器,却只能有一个 HTTP 请求处理器。
第四步:运行调试。重启服务,最简单地,在 IE 中输入以下 URI,对服务器发送 GET 请求,请求的表述格式为 Json:
http://localhost:8090/iserver/services/components-rest/rest/maps.json
运行结果为:返回 XML 格式的表述,而不是预期的 Json 格式,因为之前对 maps 资源的 HTTP 请求处理器做了替换,换成了自定义的 MyHTTPHandler,正如前面所讲,MyHTTPHandler 组件对应的类 MyMethodHandler 中,处理 GET 请求时强制生成了 XML 格式的表述。
需要说明的是,本实例仅为了说明扩展 HTTP 请求的过程,采用了一种说明问题的方式(即对 GET 请求强制生成 XML 表述),实际应用中用户可以在 HTTP 处理器中处理很多事务,比如在这里改变 HTTP 请求的处理流程、加入额外的业务处理逻辑等等。