当前位置: 首页>数据库>正文

rest接口调用jar报错 noclass java rest调用

最近总是碰到有人问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找到:

rest接口调用jar报错 noclass java rest调用,rest接口调用jar报错 noclass java rest调用_数组,第1张

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

上面只是一个简单的思路介绍,也许对高手很简单,但是毕竟初次学习,记录下来以备后查吧。

 


https://www.xamrdz.com/database/65c1932757.html

相关文章: