多平台统一管理软件接口,如何实现多平台统一管理软件接口
290
2022-12-28
java如何写接口给别人调用的示例代码
计算机语言分类有很多,如C、C++、C#、java、php、python等等,她们有各自的特性及擅长的领域,但她们各自又不是全能的。在一个稍微大型一点的项目都会用到多种语言共同完成,那么这些编程语言如何进行通信呢。什么意思呢,就是比如说我Java写的一个方法,其他编程语言要怎么去调用呢?这QNmLfKqHXq就是本文要探讨的问题了。
一般来说,方法层面的编程语言通信用的是网络接口形式,只暴露出形参和结果供别人调用。接口一般分为接口定义者和接口调用者,定义者可以规定接收参数的类型及返回形式,而接口定义者则只能完全按照接口定义者规定的参数进行访问。就叫是我们所说的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文件内容如下:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> &QNmLfKqHXqlt;name>restful-server
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
&QNmLfKqHXqlt;name>restful-server
4 applicationContext.xml内容如下:
xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:context="http://springframework.org/schema/context" xmlns:tx="http://springframework.org/schema/tx" xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd http://springframework.org/schema/context http://springframework.org/schema/context/spring-context-4.1.xsd">
xmlns:xsi="http://w3.org/2001/XMLSchema-instance"
xmlns:context="http://springframework.org/schema/context"
xmlns:tx="http://springframework.org/schema/tx"
xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd
http://springframework.org/schema/context http://springframework.org/schema/context/spring-context-4.1.xsd">
5 web.xml则主要配置采用的容器、日志管理及拦截器,拦截器可以实现到达请求郑涛之前进行身份认证,踢除没有访问资格的请求,而rest项目一般是用Jersey容器。配置如下:(kendy只是我的英文名,你们可以自己定义路径)
org.springframework.web.context.ContextLoaderListener
org.glassfish.jersey.servlet.ServletContainer
QNmLfKqHXq
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
for(Entry
String key = entry.getKey();
List
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.PQNmLfKqHXqath;
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
Map
//do something here
map.put("Size", 1024);
return map;
}
@POST
@Path("getDetail")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Map
Map
//do something here
List
Map
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
//创建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
Map
//把以下三个结果放到totalMap里返回
List
List
List
IgmAccessControlChannelModel accessControlModel = null;
IgmStationDoorModel stationDoorModel = null;
Map map = JSON.parseObject(data, Map.class);
map = (Map
List
for(Map
String deviceId = (String)(deviceMap.get("DeviceID")+"");
Object channels = deviceMap.get("Channels");
List
String id = ""; //用于设置igmaccessControlchannel表和igmstationDoor表的stationDoorid
//判断该门禁设备ID在本平台是否匹配
boolean isMatched = isDeviceIdMatched(deviceId);
if(isMatched){
for(Map
accessControlModel = new IgmAccessControlChannelModel();
stationDoorModel = new IgmStationDoorModel();
for(Map.Entry
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不匹配的跳过
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~