java如何写接口给别人调用 |
您所在的位置:网站首页 › 如何写java接口 › java如何写接口给别人调用 |
计算机语言分类有很多,如C、C++、C#、Java、Php、Python等等,她们有各自的特性及擅长的领域,但她们各自又不是全能的。在一个稍微大型一点的项目都会用到多种语言共同完成,那么这些编程语言如何进行通信呢。什么意思呢,就是比如说我Java写的一个方法,其他编程语言要怎么去调用呢?这就是本文要探讨的问题了。 一般来说,方法层面的编程语言通信用的是网络接口形式,只暴露出形参和结果供别人调用。接口一般分为接口定义者和接口调用者,定义者可以规定接收参数的类型及返回形式,而接口调用者则只能完全按照接口定义者规定的参数进行访问。就叫是我们所说的webService(网络服务)。 以前的做法是利用XML作接口格式定义,然后通过Http做通讯和请求,如大名鼎鼎的SOAP,其实现在也是的,只不过现在流行RestFul风格的Rest接口形式,但用的还是XML+HTTP,那这两者有啥区别呢?最大的区别就是SOAP返回的主要是XML格式,有时还需要附带一些辅助文件,而Rest则还可以返回JSON类型的字符串,减少了很多繁乱的XML标签。本文就以Java为例,用她写一个接口,并让其他人去调用,以此来简单展示接口调用是怎么样一个过程。 步骤: 1、本机装有Java JDK运行环境及编程IDE(如Myeclipse) 2、建立一个maven项目,用以下载jar包,项目结构如下: 3、pom.xml文件内容如下: 4.0.0 ws restful war 0.0.1-SNAPSHOT restful-server http://maven.apache.org UTF-8 2.6 2.23.1 4.2.7.RELEASE 3.1.0 1.1.1 1.7.6 junit junit 3.8.1 test org.glassfish.jersey.ext jersey-spring3 ${jersey-spring.version} org.springframework spring-core org.springframework spring-web org.springframework spring-beans org.glassfish.jersey.containers jersey-container-servlet ${jersey-spring.version} org.glassfish.jersey.containers jersey-container-servlet-core ${jersey-spring.version} org.glassfish.jersey.media jersey-media-json-jackson ${jersey.version} org.glassfish.jersey.media jersey-media-multipart ${jersey.version} org.glassfish.jersey.ext jersey-entity-filtering ${jersey.version} org.springframework spring-core ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-tx ${spring.version} org.springframework spring-test ${spring.version} test javax.servlet javax.servlet-api ${servlet-api-version} provided ch.qos.logback logback-classic ${logback.version} org.slf4j jcl-over-slf4j ${jcloverslf4j.version} restful4、applicationContext.xml内容如下: 5、web.xml则主要配置采用的容器、日志管理及拦截器,拦截器可以实现到达请求郑涛之前进行身份认证,踢除没有访问资格的请求,而rest项目一般是用Jersey容器。配置如下:(kendy只是我的英文名,你们可以自己定义路径) contextConfigLocation classpath:applicationContext.xml org.springframework.web.context.ContextLoaderListener jersey-serlvet org.glassfish.jersey.servlet.ServletContainer javax.ws.rs.Application com.kendy.filter.RestJaxRsApplication 1 jersey-serlvet /*6、拦截器如下: import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map.Entry; import javax.ws.rs.WebApplicationException; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.Provider; /** * 拦截请求 */ @Provider public class MyFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext context) throws IOException { //打印出所有请求头 MultivaluedMap map = context.getHeaders(); for(Entry entry : map.entrySet()){ String key = entry.getKey(); List valueList = entry.getValue(); String values = valueList.toString(); System.out.println(key + ":"+values.substring(1,values.length()-1)); }7、注册Jersey容器所要管理的类 import org.codehaus.jackson.jaxrs.JacksonJsonProvider; import org.glassfish.jersey.server.ResourceConfig; import com.kendy.restful.AccountManager; import com.kendy.restful.AuthorityManager; import com.kendy.restful.CardManager; import com.kendy.restful.DeviceManager; import com.kendy.restful.UserResource; /** * ${DESCRIPTION} */ public class RestJaxRsApplication extends ResourceConfig { /** * Register JAX-RS application components. */ public RestJaxRsApplication() { //服务类所在的包路径 packages("com.kendy.*"); // register application resources this.register(YouClass.class); // register filters this.register(MyFilter.class); //this.register(RequestContextFilter.class); register(JacksonJsonProvider.class); //register(MultiPartFeature.class); } }8、接口定义(Restful风格) package com.kendy.restful; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.springframework.stereotype.Component; @Component @Path("/CardManager") public class CardManager { private SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @POST @Path("size") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Map size(){ Map map = new HashMap(); //do something here map.put("Size", 1024); return map; } @POST @Path("getDetail") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Map getDetail(){ Map map = new HashMap(); //do something here List list = new ArrayList(); Map subMap = new HashMap(); subMap.put("UUID", 10086); subMap.put("CardID", 10081); subMap.put("StartTime", sdf.format(new Date())); subMap.put("EndTime", sdf.format(new Date())); list.add(subMap); map.put("Card", list); return map; } }9、调用接口,有多种方式,本文用HttpClient /** * 发送 post请求webService接口 * @param url 访问的接口地址 * @param account 用户名 * @param code 密码 * @param param 查询参数 * @return HttpResponse 该类包含请求方法的态码及返回的数据 */ public static HttpResponse post(String url,String account,String code,Map param) { //创建HttpClient实例及Post方法 HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); //对用户密码MD5加密 code = getMD5(code); //添加相关请求头,依情况而定 httppost.setHeader("Authorization","WSSE profile=\"UsernameToken\""); httppost.setHeader("X-WSSE","UsernameToken Username=\""+account+"\",PasswordDigest=\""+code+"\""); httppost.addHeader("Content-type","application/json; charset=utf-8"); httppost.setHeader("Accept", "application/json"); httppost.setHeader("Connection","keep-alive"); httppost.setHeader("Accept-Encoding","gzip"); httppost.setHeader("Accept-Language", "zh-CN,en,*"); httppost.setHeader("User-Agent","Mozilla/5.0"); //传递请求参数 String paramJsonStr = JSON.toJSONString(param); if(param != null) httppost.setEntity(new StringEntity(paramJsonStr, Charset.forName("UTF-8"))); HttpResponse response = null; try { //执行post请求 response = httpclient.execute(httppost); } catch (Exception e) { e.printStackTrace(); } return response; }10、返回接口 11、最后通过Map、List和Json工具对返回来的字面量进行各种处理。 /** * 将从接口返回的JSON数据转换为实体集合等待插入数据表 * 实体 IgmAccessControlChannelModel --> IGM_ACCESSCONTROL_CHANNEL * IgmStationDoorModel --> IGM_STATION_DOOR */ @SuppressWarnings({ "unchecked", "rawtypes" }) private Map getDeviceEntityList(String data){ Map totalMap = new HashMap(); //把以下三个结果放到totalMap里返回 List accessControlList = new ArrayList(); List doorList = new ArrayList(); List deviceIds = new ArrayList(); IgmAccessControlChannelModel accessControlModel = null; IgmStationDoorModel stationDoorModel = null; Map map = JSON.parseObject(data, Map.class); map = (Map)map; List deviceList = (List) map.get("Device"); for(Map deviceMap : deviceList){ String deviceId = (String)(deviceMap.get("DeviceID")+""); Object channels = deviceMap.get("Channels"); List channelList = (List)channels; String id = ""; //用于设置igmaccessControlchannel表和igmstationDoor表的stationDoorid //判断该门禁设备ID在本平台是否匹配 boolean isMatched = isDeviceIdMatched(deviceId); if(isMatched){ for(Map chnnelMap : channelList){ accessControlModel = new IgmAccessControlChannelModel(); stationDoorModel = new IgmStationDoorModel(); for(Map.Entry entry : chnnelMap.entrySet()){ String key = entry.getKey().trim(); String value = ""; if(key.equals("Channel")){ value =(Integer)entry.getValue()+""; }else{ value = (String)entry.getValue(); } switch(key){ case "Channel": accessControlModel.setCommandCode(Integer.parseInt(value)); accessControlModel.setControlChannelName("控制通道"+value); stationDoorModel.setDoorCode(value); break; case "Description": stationDoorModel.setStationDoorName(value); break; default: break; } } id = UUID.randomUUID().toString(); accessControlModel.setAccessControlChannelId(UUID.randomUUID().toString()); accessControlModel.setDeviceId(deviceId); accessControlModel.setStationDoorId(id); stationDoorModel.setStationDoorId(id); stationDoorModel.setDeviceId(deviceId); stationDoorModel.setRemark("指纹门禁"); accessControlList.add(accessControlModel); doorList.add(stationDoorModel); } deviceIds.add(deviceId); }else{ //deviceId不匹配的跳过 } }
如果我的文章有帮助到您,欢迎打赏一下鼓励博主。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |