作者:MR
前面的博客介绍了什么是iServer REST API),本文介绍其中一种应用的具体实现-JAVA语言通过 REST API 在 SuperMap iServer 服务器上发布一个工作空间为REST地图服务和REST数据服务。
###一、使用到的iServer REST 资源
本文采用先登录iServer再设置cookie以访问iServer管理资源的方式实现发布工作空间,所以使用到的iServer REST资源有两个,登录 和 工作空间资源。
登录URI:http://{服务器域名/IP}:{端口,默认8090}/iserver/services/security/login.{表述}
,其中,支持的表述有: rjson、json、html、xml
,不同的表述请求体和响应会不同。
登陆资源POST请求参数如下:
名称 | 类型 | 含义 |
username | String | 【必选参数】 用户名。 |
password | String | 【必选参数】 密码。 |
rememberme | boolean | 记住我。如果为 true,系统会记住用户的登录状态, 下次打开页面不需要重复登录。默认为 false。 |
登录资源响应如下:
字段 | 类型 | 说明 |
succeed | boolean | 是否成功登录。 |
referer | String | 登陆后跳转的页面。 |
工作空间URI:http://{服务器域名/IP}:{端口,默认8090}/iserver/manager/workspaces.{表述}
,其中,支持的表述有: rjson、json、html、xml
,不同的表述请求体和响应会不同。
工作空间资源参数较多,不再详细列出,只列出本文使用到的POST请求参数,详情请参考iServer帮助文档:
名称 | 类型 | 含义 |
workspaceConnectionInfo | String | 【必选参数】工作空间路径或者数据库的连接信息。 如数据库型工作空间(以下是ORACLE)表示如下: “workspaceConnectionInfo”: “server=orcl203;username=test; password=test;type=ORACLE;database=; name=testWorkSpace;driver=null” |
servicesTypes | 【必选参数】 发布的服务类型, 发布多个服务时用逗号隔开。 | |
isDataEditable | boolean | 当 servicesTypes 为 RESTDATA、WFS100、 WCS111、WCS112 时必选。 表示数据服务中的数据是否可编辑, 如果为 false 则不可编辑。 |
… |
工作空间资源响应数组每项如下:
字段 | 类型 | 说明 |
serviceAddress | String | 发布服务的地址。 |
serviceType | 发布服务的类型。 |
###二、登陆获取cookie
使用 工作空间资源需要iServer身份认证,必须是具有发布工作空间权限的iServer用户才能使用,认证的方式有两种,Token和登陆,这里使用登陆。
使用json表述(json字符串)的请求体如下:
{
"username":"admin",
"password":"Admin@123",
"rememberme":"true"
}
使用java.net.HttpURLConnection
的实例去发送POST请求即可,登陆方法如下:
/**
* 登陆iServer
*
* @param ipport
* iServer服务根目录,比如:"http://localhost:8090"
* @param username
* 登陆iServer的用户名
* @param passwor
* 登陆iServer的密码
* @return String cookie
*/
private String login( String ipport, String username, String passwor )
{
try
{
String json = "{\"username\": \"" + username + "\",\"password\": \"" + passwor
+ "\",\"rememberme\": \"true\"}";
URL url = new URL( ipport + "/iserver/services/security/login.json" );
HttpURLConnection connection = (HttpURLConnection) url.openConnection( );
connection.setDoInput( true );
connection.setDoOutput( true );
connection.setRequestMethod( "POST" );
connection.setUseCaches( false );
connection.setInstanceFollowRedirects( true );
connection.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" );
connection.connect( );
DataOutputStream out = new DataOutputStream( connection.getOutputStream( ) );
out.writeBytes( json );
out.flush( );
out.close( );
// 读取响应结果sbf,本文只需要拿到cookie
//BufferedReader reader = new BufferedReader( new InputStreamReader( connection.getInputStream( ) ) );
//String lines;
//StringBuffer sbf = new StringBuffer( );
//while ( ( lines = reader.readLine( ) ) != null )
//{
// lines = new String( lines.getBytes( ), "utf-8" );
// sbf.append( lines );
//}
//reader.close( );
//connection.disconnect( );
return connection.getHeaderField( "set-cookie" );
} catch ( MalformedURLException e )
{
e.printStackTrace( );
} catch ( Exception e )
{
e.printStackTrace( );
}
return "";
}
###三、发布工作空间
发布工作空间的方法与登陆一样,不过发布工作空间需要iServer身份认证,在请求头带上登陆后拿到的cookie就能通过身份认证了,请求头设置cookie的方法如下:
// String cookie = login( ipport, username, passwor );
HttpURLConnection connection = (HttpURLConnection) url.openConnection( );
connection.setRequestProperty( "cookie", cookie );
使用json表述(json字符串)的请求体如下(发布文件型工作空间为REST 地图服务、REST 数据服务,且数据服务可编辑):
{
"servicesTypes":["RESTMAP", "RESTDATA"],
"workspaceConnectionInfo":"F:/Data/TestData.smwu",
"isDataEditable":"true"
}
需要注意上述路径是iServer 服务器上的路径,需要保证服务器上该文件存在,且注意Windows、Linux上路径都使用“/”分隔;发布数据库工作空间需要使用iServer服务器上的数据库链接字符串,保证服务器使用该链接信息能连上对应数据库。
另,若需要上传文件型工作空间(和数据源)可以使用REST API uploadTask资源,该资源同样需要对应权限的身份验证。