您的位置:首页 > 编程语言 > Java开发

转:java如何写接口给别人调用

2018-03-06 17:24 435 查看
计算机语言分类有很多,如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文件内容如下:[html] view plain copy<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>  
<
20000
li style="border-top:none;border-right:none;border-bottom:none;border-left:3px solid rgb(108,226,108);background-color:rgb(248,248,248);line-height:18px;margin-right:0px;margin-bottom:0px;padding:0px 3px 0px 10px;list-style-position:outside;">        <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内容如下:[html] view plain copy<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       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.*"></context:component-scan>  
</beans>  

5 web.xml则主要配置采用的容器、日志管理及拦截器,拦截器可以实现到达请求郑涛之前进行身份认证,踢除没有访问资格的请求,而rest项目一般是用Jersey容器。配置如下:(kendy只是我的英文名,你们可以自己定义路径)[html] view plain copy<?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 拦截器如下:[java] view plain copyimport 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<String, String> map =  context.getHeaders();  
    for(Entry<String, List<String>> entry : map.entrySet()){  
        String key = entry.getKey();  
        List<String> valueList = entry.getValue();  
        String values = valueList.toString();  
        System.out.println(key + ":"+values.substring(1,values.length()-1));  
    }  

7 注册Jersey容器所要管理的类[java] view plain copyimport 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 copypackage 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<String,Object> size(){  
        Map<String,Object> 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<String,List<Map<String,Object>>> getDetail(){  
        Map<String,List<Map<String,Object>>> map = new HashMap<>();  
        //do something here  
        List<Map<String,Object>> list = new ArrayList<>();  
        Map<String,Object> 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不匹配的跳过  
        }  
    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java接口编写