java如何写接口给别人调用

您所在的位置:网站首页 如何写java接口 java如何写接口给别人调用

java如何写接口给别人调用

2024-07-17 19:13:33| 来源: 网络整理| 查看: 265

计算机语言分类有很多,如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} restful

4、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不匹配的跳过 } }

 

 

 

 

如果我的文章有帮助到您,欢迎打赏一下鼓励博主。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


    图片新闻

    实验室药品柜的特性有哪些
    实验室药品柜是实验室家具的重要组成部分之一,主要
    小学科学实验中有哪些教学
    计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
    实验室各种仪器原理动图讲
    1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
    高中化学常见仪器及实验装
    1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
    微生物操作主要设备和器具
    今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
    浅谈通风柜使用基本常识
     众所周知,通风柜功能中最主要的就是排气功能。在

    专题文章

      CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭