189 8069 5689

java如何写接口给别人调用的示例代码

计算机语言分类有很多,如C、C++、C#、Java、Php、Python等等,她们有各自的特性及擅长的领域,但她们各自又不是全能的。在一个稍微大型一点的项目都会用到多种语言共同完成,那么这些编程语言如何进行通信呢。什么意思呢,就是比如说我Java写的一个方法,其他编程语言要怎么去调用呢?这就是本文要探讨的问题了。

创新互联是专业的二道江网站建设公司,二道江接单;提供网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行二道江网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

一般来说,方法层面的编程语言通信用的是网络接口形式,只暴露出形参和结果供别人调用。接口一般分为接口定义者和接口调用者,定义者可以规定接收参数的类型及返回形式,而接口定义者则只能完全按照接口定义者规定的参数进行访问。就叫是我们所说的webService(网络服务)。

以前的做法是利用XML作接口格式定义,然后通过Http做通讯和请求,如大名鼎鼎的SOAP,其实现在也是的,只不过现在流行RestFul风格的Rest接口形式,但用的还是XML+HTTP,那这两者有啥区别呢?最大的区别就是SOAP返回的主要是XML格式,有时还需要附带一些辅助文件,而Rest则还可以返回JSON类型的字符串,减少了很多繁乱的XML标签。本文就以Java为例,用她写一个接口,并让其他人去调用,以此来简单展示接口调用是怎么样一个过程。

步骤:

1、本机装有Java JDK运行环境及编程IDE(如Myeclipse)

2、建立一个maven项目,用以下载jar包,项目结构如下:

java如何写接口给别人调用的示例代码

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内容如下:

<?xml version="1.0" encoding="UTF-8"?>

 
  

5 web.xml则主要配置采用的容器、日志管理及拦截器,拦截器可以实现到达请求郑涛之前进行身份认证,踢除没有访问资格的请求,而rest项目一般是用Jersey容器。配置如下:(kendy只是我的英文名,你们可以自己定义路径)

<?xml version="1.0" encoding="UTF-8"?>

 
 
  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 返回接口

java如何写接口给别人调用的示例代码

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。


名称栏目:java如何写接口给别人调用的示例代码
文章出自:http://jkwzsj.com/article/gppijo.html

其他资讯