json-rpc是基于json的跨语言远程调用协议,比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、java-rpc等二进制协议便于调试、实现、扩展,是很是优秀的一种远程调用协议。目前主流语言都已有json-rpc的实现框架,java语言中较好的json-rpc实现框架有jsonrpc4j、jpoxy、json-rpc。三者之中jsonrpc4j既可独立使用,又可与spring无缝集合,比较适合于基于spring的项目开发。本文将介绍jsonrpc4j的具体使用。jsonrpc4j为开源项目,源代码和JAR包在网上均可如下载到,为了不广告嫌疑故略去。java
web.xml 中添加web
<servlet> <servlet-name>JsonRpcServerServlet</servlet-name> <servlet-class>com.service.jsonrequest.ServiceJsonRpcServlet</servlet-class> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JsonRpcServerServlet</servlet-name> <url-pattern>/json-Rpc</url-pattern> </servlet-mapping>
此处配置的/json-Rpc为客户端请求访问地址。spring
ServiceJsonRpcServlet的servletsql
private JsonRpcServer rpcService = null; public void init(ServletConfig config) throws ServletException { super.init(config); rpcService = new JsonRpcServer(new ReceiveChannel(), ReceiveChannel.class); }
此处的ReceiveChannel类就是将向客户端展示的类。在service方法中能够对客户端的请求头进行预验证json
protected void service(HttpServletRequest req, HttpServletResponse resp){ String UserKey = req.getHeader("UserKey"); //在此能够验证客户端的请求,前提是客户端须要在请求头中加入相应的值,我在后面在讲。 }
接下来咱们看ReceiveChannel的实现,ReceiveChannel里面的方法是能够被客户端所能调用的,方法的返回对象是能够被客户端所接收到的,返回的类型能够在客户端进行定义,能够是String,List,int,甚至能够是Java bean对象或者json格式。对于方法的传参,在客户端调用的时候须要设置,如下我以例子为你们讲解数组
public List<HashMap<String,Object>> publicQuery(String key1,String key2,String sql) throws Exception{ //在进行业务逻辑处理前,能够对传递过来的参数进行合法性验证。 //有必要的状况下能够对参数进行加密,并在这里解密。 List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>(); HashMap<String,Object> hm = new LinkedHashMap<String,Object>(); hm.put("网站名称","轰隆隆小站"); hm.put("网站地址","http://www.honglonglong.com"); list.add(hm); return list; }
public List<LinkedHashMap<String,Object>> getQueryMap(String sql){ List<LinkedHashMap<String,Object>> list = new ArrayList<LinkedHashMap<String,Object>>(); JsonRpcHttpClient client; try { //实例化请求地址,注意服务端web.xml中地址的配置 client = new JsonRpcHttpClient(new URL("http://127.0.0.1:8080/json-Rpc")); } catch (MalformedURLException e) { e.printStackTrace(); return list; } //请求头中添加的信息 Map<String,String> headers = new HashMap<String,String>(); headers.put("UserKey", "www.honglonglong.com"); //添加到请求头中去 client.setHeaders(headers); try { //将请求参数封装为数组(注:服务端publicQuery方法的参数个数) String [] send =new String[3]; send[0]="我是轰隆隆"; send[1]="轰隆隆是我"; send[2]=sql; long x1=System.currentTimeMillis(); //此处就是向服务端获取数据。publicQuery就是ReceiveChannel对外公开的方法。 list = client.invokes("publicQuery",send); System.out.println("请求时间:"+ (System.currentTimeMillis()-x1)+"毫秒,返回记录数:"+list.size()+"条,SQL:"+sql); return list; } catch (Throwable e) { e.printStackTrace(); return null; } }
接下来咱们看一下JsonRpcHttpClient的invokes方法写法app
@SuppressWarnings("unchecked") public <T> T invokes(String methodName, Object argument)throws Throwable { return (T)invoke(methodName, argument,Type.class.cast(List.class)); }
其中的invoke方法是JsonRpcHttpClient类的原始方法,能够不做处理。框架
至此,整个请求流程结束,各位能够试着运行,有问题能够随时觅我,本人轰隆隆-小站欢迎你们光临。网站
由于时间仓促,文章不免有纰漏和不足之处,敬请各位大侠斧正。加密
转贴请注明轰隆隆-小站