WebService开发实战

317 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

1、前言

上一次为大家分享了WebService的一些基本知识与使用场景,本次为大家分享下实际开发中的一些总结。本文中是基于SSM项目开发的有需要的伙伴可以参考借鉴一下。

2、准备工作

2.1、引入Apache CXF

这里通过maven方式引入,找到适合的版本引入即可,需要注意下CXF框架中的依赖包是否与项目中的其他依赖有冲突。同时为了稳定起见,尽量避免引入的版本太老或者太新。

2.2、创建WebService配置文件

示例如下:

<?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:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://cxf.apache.org/jaxws
 http://cxf.apache.org/schemas/jaxws.xsd">
 <import resource="classpath*:META-INF/cxf/cxf.xml"/>

 <jaxws:endpoint implementor="#cfControlDownMsgRecWsService" address="/cfDown"/>
 <jaxws:endpoint implementor="#cfControlUpMsgRecWsService" address="/cfUp"/>
 <jaxws:endpoint implementor="#cfControlUpMsgRecHtWsService" address="/heart"/>

</beans>

注意:如果CXF版本小于3.0,要在配置文件里额外加入下面两行,不然项目启动时可能会报错。

<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

2.3、初始化WebService

实现WebApplicationInitializer接口,在项目启动时加载WebService配置文件。

public class WebServiceInit implements WebApplicationInitializer {
 @Override
 public void onStartup(ServletContext servletContext) throws ServletException {
  ServletRegistration.Dynamic dynamic = servletContext.addServlet("ws", CXFServlet.class);
  dynamic.setInitParameter("config-location", "classpath*:org/cpms/wsservice/webservice.xml");
  dynamic.addMapping("/ws/*");
  FilterRegistration.Dynamic dynamicFilter = servletContext.addFilter("webServiceFilter", DelegatingFilter.class);
  dynamicFilter.setAsyncSupported(true);
  dynamicFilter.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "ws");
 }
}

2.4、定义WebServiceFilter

这里主要是为了在某些特定的请求中,设置其编码格式等。

@Component
public class WebServiceFilter extends OncePerRequestFilter {
 private final static String ENCODING = "UTF-8";
 
 private static final Logger logger = LoggerFactory.getLogger("rest");

 @Override
 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  if (request.getContentType() != null && request.getContentType().startsWith(MediaType.TEXT_XML_VALUE)) {
   response = new LoggingBodyHttpServletResponse(response, logger);
   request.setCharacterEncoding(ENCODING);
   response.setCharacterEncoding(ENCODING);
  }
  filterChain.doFilter(request, response);
 }
}

3、创建WebService接口

/**
 * webservice报文接收接口
 */
public interface IMsgRecWsService {

 public String msgRecService(String msg);
}

4、创建WebService实现类

使用RPC方式

/**
 * 心跳服务
 */
@Component("cfControlHtWsService")
@WebService(targetNamespace = "http://baws.com/")
@SOAPBinding(style = Style.RPC)
public class cfControlHtWsService implements IMsgRecWsService{
 
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public String msgRecService(String json) {
        json = json.trim();
        logger.info("【心跳服务】接收请求报文:{}" , json);
        JSONObject jsonObject = JSONObject.parseObject(json);
        String heartStatusArray = jsonObject.getString("HeartStatusList");

        List<HeartStatus> heartLists = JSONObject.parseArray(heartStatusArray, HeartStatus.class);
        List<HeartStatus> retHeartLists = setHeartStatus(heartLists);

        JSONObject jSONObject=new JSONObject();
        jSONObject.put("HeartStatusList",retHeartLists);
        return JSONObject.toJSONString(jSONObject);
    }

5、发布WebService

访问路径:项目地址/platform?wsdl,出现下图所示则说明WebService接口发布成功

image.png

6、访问WebService

6.1、创建WebServiceClientUtil工具类

public class WebServiceClientUtil {
 private static Logger logger = LoggerFactory.getLogger(WebServiceClientUtil.class);
 /**默认超时时间(秒)*/
 private static final Integer DEFAULT_TIME_OUT = 90;

 private static final Map<String, Client> CLIENT_MAP = new HashMap<>();

 private static JaxWsDynamicClientFactory DCF = JaxWsDynamicClientFactory.newInstance();

 public static Object[] webServiceClient(String wsUrl, String method, String requestXml, Integer timeout) {
  return webServiceClient(wsUrl, method, new Object[] { requestXml }, timeout);
 }
 
 public static Object[] webServiceClient(String wsUrl, String method, Object[] methodParam, Integer timeout) {
  try {
   Client client = null;
   if(CLIENT_MAP.containsKey(wsUrl)){
    client = CLIENT_MAP.get(wsUrl);
   }else{
    client = DCF.createClient(wsUrl);
    CLIENT_MAP.put(wsUrl, client);
   }
   HTTPConduit http = (HTTPConduit) client.getConduit();
   HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
   if (timeout == null) {
    // 连接超时时间
    httpClientPolicy.setConnectionTimeout(DEFAULT_TIME_OUT * 1000);
    // 响应超时
    httpClientPolicy.setReceiveTimeout(DEFAULT_TIME_OUT * 1000);
   } else {
    // 连接超时时间
    httpClientPolicy.setConnectionTimeout(timeout * 1000);
    // 响应超时
    httpClientPolicy.setReceiveTimeout(timeout * 1000);
   }
   // 取消块编码
   httpClientPolicy.setAllowChunking(false);
   http.setClient(httpClientPolicy);
   if (methodParam.length > 1) {
    return client.invoke(method, methodParam);
   } else {
    return client.invoke(method, methodParam[0]);
   }
  } catch (Exception ex) {
   logger.info("---调用WebService【" + wsUrl + "】服务失败..." + ex);
   ex.printStackTrace();
   throw new SystemException(SystemExceptionEnum.S30002, wsUrl, ex.getMessage());
  }
 }
 
 public static Object[] webServiceClient(String wsUrl, String method, String requestXml) throws Exception {
  return webServiceClient(wsUrl, method, requestXml, null);
 }

 public static String webServiceClientToString(String wsUrl, String method, String requestXml, Integer timeout) throws Exception {
  Object[] object = webServiceClient(wsUrl, method, requestXml, timeout);
  if (object.length > 0) {
   return (String) object[0];
  } else {
   return null;
  }
 }

 public static String webServiceClientToString(String wsUrl, String method, String requestXml) throws Exception {
  Object[] object = webServiceClient(wsUrl, method, requestXml);
  if (object.length > 0) {
   return (String) object[0];
  } else {
   return null;
  }
 }

}

6.2、访问示例

public HeartStatus heartbeatCheck() {
    String recXml = (String) WebServiceClientUtil.webServiceClient(webServiceUrl, method, sendXml, WS_TIMEOUT)[0];
    logger.info(recXml);
    HeartStatus heartStatusResult = JSONObject.parseObject(recXml, HeartStatus.class);
    return heartStatusResult;
}

好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊