最近总是碰到有人问Java如何访问SuperMap iServerJava6R的服务,由于目前SuperMap iServerJava6R不支持RMI访问访问,所以考虑使用Java直接访问REST的API。
环境准备:
1、开发工具 MyEclipse,服务器iServerJava6R
2、HttpComponents及Org.json类库,第一个http协议的开源Java客户端工具库,org.json是Json库,这两个都在iServerJava6R依赖库中,直接调用即可。如下图为所用类库,可以直接在iServerJava6R安装目录下\webapps\iserver\WEB-INF\lib找到:
3、iServerJava6R的REST API的文档
开发思路:
1、根据REST API构造参数类。
2、调用HttpComponents发送请求,解析结果
3、展现结果,一般使用地图
实现一个简单的吧,就调用distance,量算距离,上代码吧:
1、参数类,distance接口需要两个参数一个是Point2D数组,另外一个是一个枚举单位,我一般习惯使用以米为单位,所以直接用单位METER了。
参数类/**
* 参数类
* @author awei20081
*
*/
public class Point2D {
private double x ;
private double y;
public Point2D(double x,double y){
this.x = x;
this.y =y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
2、发送请求与解析,这里distance接口是一个get请求,所以构造调用HttpComponents的HttpGet对象,代码如下:
请求发出与解析import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
public class getDemo {
public final static void main(String[] args) throws Exception {
//构建请求的URL
String url="http://localhost:8090/iserver/services/map-world/rest/maps/%E4%B8%96%E7%95%8C%E5%9C%B0%E5%9B%BE/distance.rjson?";
//构造参数
ArrayList<Point2D> arrayList = new ArrayList<Point2D>();
arrayList.add(new Point2D(0,0));
arrayList.add(new Point2D(10,10));
//GET的URL,参数直接加URL后
URL uri = new URL(url+URLEncoder.encode("point2Ds="+toJSONArray(arrayList),"UTF-8")+"&unit=METER");
HttpGet httpget=new HttpGet(uri.toString());
//执行http的get请求
HttpResponse response=new DefaultHttpClient().execute(httpget);
//发送GET,并返回一个HttpResponse对象,相对于POST,省去了添加NameValuePair数组作参数
if(response.getStatusLine().getStatusCode()==200){//如果状态码为200,就是正常返回
String result=EntityUtils.toString(response.getEntity());
//得到返回的字符串
JSONObject jsresult = new JSONObject(result);
System.out.println("长度为"+jsresult.get("distance")+" "+jsresult.getString("unit"));
//打印输出
}
}
public static StringBuilder toJSONArray(ArrayList<Point2D> arrayList)
{
StringBuilder string = new StringBuilder();
string.append("[");
for (int i = 0; i < arrayList.size()-1; i++) {
JSONObject jsObject = new JSONObject(arrayList.get(i));
string.append(jsObject.toString()+",");
}
JSONObject jsObject = new JSONObject(arrayList.get(arrayList.size()-1));
string.append(jsObject.toString());
string.append("]");
return string;
}
}
备注:这个地方比较纠结,我第一用HttpComponents碰到比较多的问题列举如下阅读时候可以参考一下:
(1)url可以直接获取,即http://localhost:8090/iserver/services/map-world/rest/maps/世界地图/distance.rjson,但是不能直接用,因为需要对中文进行编码,而且不能直接调用URLEncoder直接对这个url整体进行编码,此处我图简单直接对 世界地图 进行编码为:/%E4%B8%96%E7%95%8C%E5%9C%B0%E5%9B%BE,所以url为http://localhost:8090/iserver/services/map-world/rest/maps/%E4%B8%96%E7%95%8C%E5%9C%B0%E5%9B%BE/distance.rjson,可以逐段解析url进行编码。
(2)、如果直接用org.json类库中JSONArray构造解析Point2D数组,解析结果不太对,所以我直接构造一个toJSONArray来对Point2D数组进行处理。
(3)、默认浏览器对url进行编码处理时候使用的是utf-8编码,而且iServerJava6R对请求返回结果的编码为utf-8。
3、结果展示,此处偷懒了直接调用println函数输出。
长度为1570277.6641936298 METER
上面只是一个简单的思路介绍,也许对高手很简单,但是毕竟初次学习,记录下来以备后查吧。