发布领域服务组件为 REST 资源 |
在 SuperMap iServer/iEdge将领域组件发布为 REST 服务的机制里,可以将领域组件实现类中的方法发布成 REST 资源。
例如,针对将如下组件实现发布为 REST 资源:
package com.supermap.sample.DomainResource;
public class myComponent {
//比较两个字符串是否相同,简单参数类型,返回简单的结果。
public boolean compareString(String str1, String str2) {
boolean flag = true;
if (str1 != null) {
if (!str1.equals(str2)) {
flag = false;
}
} else if (str2 != null) {
flag = false;
}
return flag;
}
}
只需将该类编译后的 Jar 包放到 %SuperMapiServer_HOME%/webapps/iserver/WEB-INF/lib 目录下,然后在 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF 目录下的 iserver-services.xml 文件中增加该组件的配置即可,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<server>
...
<application>
...
<components>
...
<component name="myComponent"
class="com.supermap.sample.DomainResource.myComponent" providers="" interfaceNames="rest">
</component>
</components>
</application>
</server>
发布为 REST 服务的领域资源根目录为:http://<iServer-root>/{domainComponentName}/rest,在本示例中,发布为 REST 服务的领域资源根目录为:
http://localhost:8090/iserver/services/myComponent/rest
其资源结构如下:
访问 compareStringResult 资源,获取 XML 表述的一个示例 URI 为:
http://localhost:8090/iserver/services/myComponent/rest/domainComponents/mycomponent/compareStringResult.xml?arg0="abc"&arg1="abc"
响应结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<boolean>true</boolean>
领域组件实现类中,所有有返回值的 public 方法都将被发布成资源,方法的参数类型和个数不同,发布成为的领域资源的类型也不同(请参见 JavaDoc 文档中的 ResourceType 枚举提到的两种领域资源类型,即 DomainArithmeticResource 和 DomainArithResultResource),下面将详细说明。
首先我们对领域组件中的方法做一个界定,界定为简单方法和复杂方法两种:
简单方法:参数类型为简单类型,且参数个数在10个以下的方法。简单类型有:boolean,int,byte,short,long,double,String,char。
复杂方法:参数类型为复杂类型(除简单类型以外的其他类型),或参数个数在10个以上的方法。
把领域资源也界定为简单领域资源和复杂领域资源,SuperMap iServer 将领域组件中的简单方法发布成简单领域资源,复杂方法发布成复杂领域资源:
简单领域资源:即 ResourceType.DomainArithmeticResource 类型的资源。对应简单方法,资源名为方法名后加上“Result”(注:get 方法例外,资源名为方法名去掉 get 后的部分,并且首字母小写)。该资源的参数通过 URI 传递,直接返回结果。
复杂领域资源:即 ResourceType.DomainArithResultResource 类型的资源。对应复杂方法,资源名为方法名后加上“Results”,该资源的参数通过请求体传递,通过先创建结果资源,然后获取结果资源的方式(即先 POST 后 GET),才能得到结果。
下表列举了一个类中的 public 方法跟自动发布为 REST 资源后的资源名的对应关系:
public 方法 | 含义 | 对应的资源名 |
void output(String s) | 无返回值的方法。 | 无。 |
String getParam() | get 方法,获取参数。 | param |
boolean isParamNull() | get 方法,判断是否为空。 | paramNull |
boolean isParamNull(String s) | 一般简单方法(参见 方法类型的说明)。 | isParamNullResult |
String Param() | 参数为空的简单方法,用于获取 param 参数。 | ParamResult |
Point getCenter(Point, Point) | 复杂方法,因为参数类型为复杂类型(参见 方法类型的说明)。 | getCenterResults |
boolean compareString(String, String) | 简单方法(参见 方法类型的说明)。 | compareStringResult |
boolean isStrContainedInArray(String, String[]) | 复杂方法,因为参数类型为复杂类型(参见 方法类型的说明)。 | isStrContainedInArrayResults |
需要说明的是,领域组件中 public 方法发布成 REST 资源后,使用 HTTP 方法访问时,传递的参数要按原来方法中参数的顺序,依次使用 arg0、arg1、arg2……作为参数字段的名称,参数的传递在 URI 中通过键-值对的方式进行。
关于更多领域空间服务扩展的内容,请参见:领域服务扩展。