目录
Web Service基本概念
调用原理
环境配置
pom.xml引入jar包依赖
web.xml设置servelet
添加webService服务接口的bean文件 applicationContext-cxf.xml
提供webservice服务端接口(此处如果项目不需要对外提供服务可以跳过)
编写webService服务的java类
客户端调用webService服务
基于动态代理工厂类JaxWsDynamicClientFactory调用
基于httpclient调用webservice服务
Web Service基本概念
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
调用原理
环境配置
pom.xml引入jar包依赖
代码语言:javascript复制<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.11</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.11</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.11</version>
</dependency>
<!-- 加入cxf-restful依赖包 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.1.11</version>
</dependency>
web.xml设置servelet
代码语言:javascript复制<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/webService/*</url-pattern>
</servlet-mapping>
注意:添加位置别搞错啦如下图:
添加webService服务接口的bean文件 applicationContext-cxf.xml
注意文件位置:此处我web.xml配置的xml扫描路劲为
因此我的文件是在src/main/resources/spring/applicationContext-cxf.xml,文件内容如下
代码语言:javascript复制<?xml version="1.1" 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"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd ">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="CommonWebServiceServerService" class="com.xxx.common.webService.impl.CommonWebServiceServerServiceImpl" />
<jaxws:endpoint implementor = "#CommonWebServiceServerService" address="/webServiceServer" publish="true" />
</beans>
提供webservice服务端接口(此处如果项目不需要对外提供服务可以跳过)
编写webService服务的java类
先写一个interface接口
代码语言:javascript复制package com.xxx.common.webService;
public interface CommonWebServiceServerService {
String commonMethod( String xmlData);
}
再写它的实现类:
代码语言:javascript复制package com.xxx.common.webService.impl;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@WebService(targetNamespace = "http://webService.common.xxx.com")
public class CommonWebServiceServerServiceImpl implements CommonWebServiceServerService{
private static final Logger logger = LoggerFactory.getLogger(CommonWebServiceServerServiceImpl.class);
@WebMethod
@WebResult(targetNamespace = "http://webService.common.xxx.com")
public String commonMethod(@WebParam(targetNamespace = "http://webService.common.xxx.com") String xmlData){
long start = System.currentTimeMillis();
logger.info("接收第三方(webservice)报文:{}", xmlData);
String retXml = "";
try {
//此处写你具体的业务逻辑处理并返回客户端响应
} catch (Exception e) {
logger.error("接收第三方(webservice)报文处理异常:{}", e);
} finally {
logger.info("处理第三方(webservice)请求花费的时间为:{}毫秒", System.currentTimeMillis()-start);
}
return retXml;
}
}
注意:命名空间targetNamespace 是你接口所在的package包名倒装的全路径
客户端调用webService服务
客户端调用的方式有多种,个人认为根据自己实际情况使用吧
基于动态代理工厂类JaxWsDynamicClientFactory调用
目录
环境配置
pom.xml引入jar包依赖
web.xml设置servelet
添加webService服务接口的bean文件 applicationContext-cxf.xml
提供webservice服务端接口(此处如果项目不需要对外提供服务可以跳过)
编写webService服务的java类
客户端调用webService服务
基于动态代理工厂类JaxWsDynamicClientFactory调用
基于httpclient调用webservice服务
基于httpclient调用webservice服务
代码语言:javascript复制import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
public class HttpClientTest {
static String wsdl = "http://ip:port/webService/webServiceServer?wsdl";
static String ns = "http://webService.common.xxx.com";//命名空间
static String method = "commonMethod";//方法名
/**
* 访问服务
*
* @param wsdl wsdl地址
* @param ns 命名空间
* @param method 方法名
* @param req_xml 请求参数
* @return
* @throws Exception
*/
public synchronized static String accessService(String wsdl, String ns, String method,String reqXml) throws Exception {
String soapResponseData = "";
StringBuffer soapRequestData = new StringBuffer("");
soapRequestData.append("<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="" ns "">");
soapRequestData.append("<soapenv:Header/>");
soapRequestData.append("<soapenv:Body>");
soapRequestData.append("<ser:" method ">");
soapRequestData.append("<arg0>" reqXml "</arg0>");
soapRequestData.append("</ser:" method ">");
soapRequestData.append("</soapenv:Body>" "</soapenv:Envelope>");
PostMethod postMethod = new PostMethod(wsdl);
// 然后把Soap请求数据添加到PostMethod中
byte[] b = null;
InputStream is = null;
try {
b = soapRequestData.toString().getBytes("utf-8");
is = new ByteArrayInputStream(b, 0, b.length);
RequestEntity re = new InputStreamRequestEntity(is, b.length, "application/soap xml; charset=UTF-8");
postMethod.setRequestEntity(re);
HttpClient httpClient = new HttpClient();
int status = httpClient.executeMethod(postMethod);
if (status == 200) {
System.out.println("成功调用webService接口返回内容:" postMethod.getResponseBodyAsString());
soapResponseData = getMesage(postMethod.getResponseBodyAsString());
}else {
System.out.println("调用webService接口失败:STATUS:" status);
System.out.println("httpPost方式调用webservice服务异常:" postMethod.getResponseBodyAsString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
is.close();
}
}
return soapResponseData;
}
public static String getMesage(String soapAttachment) {
if (soapAttachment != null && soapAttachment.length() > 0) {
int begin = soapAttachment.indexOf("<return>");
begin = soapAttachment.indexOf(">", begin);
int end = soapAttachment.indexOf("</return>");
String str = soapAttachment.substring(begin 1, end);
str=str.replace("<", "<");
str=str.replace(""", """);
str=str.replace(">", ">");
return str;
} else {
return "";
}
}
}
上面为工具类,如有不合适可以根据自己的请求内容作出修改,调用方式
String response = accessService(wsdl, ns, method,reqXml);
还有一种axis2调用webService的方式
感兴趣的可以自己下去研究,小编是在曾经一次项目中调用银行的接口时用过一次,就是多种方式,如果上述两种方式都有问题时,再考虑第三种。因为cxf需要服务端和客户端的版本一致。所以有时候包的版本不一致时,会有问题。