更新时间:2022-10-11 10:27:18 来源:极悦 浏览1025次
我们应该知道,写接口就是为了方便程序员开发的,这样也节省程序员的时间,那么java如何写接口给别人调用?接下来,我们就来给大家讲解一下这方面的内容。
1.本机装有Java JDK运行环境及编程IDE(如Myeclipse)
2.建立一个maven项目,用以下载jar包,项目结构如下:
3.pom.xml文件内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ws</groupId>
<artifactId>restful</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>restful-server</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jersey.version>2.6</jersey.version>
<jersey-spring.version>2.23.1</jersey-spring.version>
<spring.version>4.2.7.RELEASE</spring.version>
<servlet-api-version>3.1.0</servlet-api-version>
<logback.version>1.1.1</logback.version>
<jcloverslf4j.version>1.7.6</jcloverslf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>${jersey-spring.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey-spring.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey-spring.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-entity-filtering</artifactId>
<version>${jersey.version}</version>
</dependency>
<!-- Spring4.2 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api-version}</version>
<scope>provided</scope>
</dependency>
<!-- Logback dependencies -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jcloverslf4j.version}</version>
</dependency>
</dependencies>
<build>
<finalName>restful</finalName>
</build>
</project>
4.applicationContext.xml内容如下:
<beans xmlns="http://www.springframework.org/schema/beans" p="" <="">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<context:component-scan base-package="com.kendy.*">
5.web.xml则主要配置采用的容器、日志管理及拦截器,拦截器可以实现到达请求郑涛之前进行身份认证,踢除没有访问资格的请求,而rest项目一般是用Jersey容器。配置如下:(kendy只是我的英文名,你们可以自己定义路径)
<? xml version = "1.0"
encoding = "UTF-8" ? >
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.kendy.filter.RestJaxRsApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
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
{
//打印出所有请求头
MultivaluedMapmap = context.getHeaders();
for (Entry < string, list > entry: map.entrySet())
{
String key = entry.getKey();
ListvalueList = 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风格)
[java] view plain copy
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
[java] view plain copy
/**
* 发送 post请求webService接口
* @param url 访问的接口地址
* @param account 用户名
* @param code 密码
* @param param 查询参数
* @return HttpResponse 该类包含请求方法的态码及返回的数据
*/
public static HttpResponse post(String url, String account, String code, Map < String, Object > 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工具对返回来的字面量进行各种处理。
[java] view plain copy
/**
* 将从接口返回的JSON数据转换为实体集合等待插入数据表
* 实体 IgmAccessControlChannelModel --> IGM_ACCESSCONTROL_CHANNEL
* IgmStationDoorModel --> IGM_STATION_DOOR
*/
@SuppressWarnings(
{
"unchecked"
, "rawtypes"
})
private Map < String, Object > getDeviceEntityList(String data)
{
Map < String, Object > totalMap = new HashMap < > ();
//把以下三个结果放到totalMap里返回
List < IgmAccessControlChannelModel > accessControlList = new ArrayList < > ();
List < IgmStationDoorModel > doorList = new ArrayList < > ();
List < String > deviceIds = new ArrayList < > ();
IgmAccessControlChannelModel accessControlModel = null;
IgmStationDoorModel stationDoorModel = null;
Map map = JSON.parseObject(data, Map.class);
map = (Map < String, List < Map < String, Object >>> ) map;
List < Map < String, Object >> deviceList = (List < Map < String, Object >> ) map.get("Device");
for (Map < String, Object > deviceMap: deviceList)
{
String deviceId = (String)(deviceMap.get("DeviceID") + "");
Object channels = deviceMap.get("Channels");
List < Map < String, Object >> channelList = (List < Map < String, Object >> ) channels;
String id = ""; //用于设置igmaccessControlchannel表和igmstationDoor表的stationDoorid
//判断该门禁设备ID在本平台是否匹配
boolean isMatched = isDeviceIdMatched(deviceId);
if (isMatched)
{
for (Map < String, Object > chnnelMap: channelList)
{
accessControlModel = new IgmAccessControlChannelModel();
stationDoorModel = new IgmStationDoorModel();
for (Map.Entry < String, Object > 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不匹配的跳过
}
}
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习