webservice开发
1 webservice开发规范
JAVA 中共有三种WebService规范,分别是JAXM & SAAJ
、JAX-WS(JAX-RPC)
、JAX-RS
。
1.1 JAX-WS
JAX-WS(Java API For XML - WebService),JDK1.6 自带的版本为JAX-WS2.1,其底层支持为JAXB。JAX-WS(JSR 224)规范的API 位于javax.xml.ws.*
包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。
1.2 JAXM & SAAJ
JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*
包,它是JAVA EE 的可选包,因此你需要单独下载。
SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范,其API 位于javax.xml.soap.*
包。
JAXM & SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节,可以使用JAXM&SAAJ,目前版本为1.3。
1.3 JAX-RS:
JAX-RS 是JAVA 针对REST(RepresentationState Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行,你需要到JCP 上单独下载JAX-RS 规范的接口,其API 位于javax.ws.rs.*
包。
这里的JAX-WS 和JAX-RS 规范我们采用 Apache CXF 作为实现,CXF 是 Objectweb Celtix 和 Codehaus XFire 合并而成。CXF 的核心是org.apache.cxf.Bus
(总线),类似于Spring 的ApplicationContext,Bus 由BusFactory 创建,默认是SpringBusFactory 类,可见默认CXF是依赖于Spring 的,Bus 都有一个ID,默认的BUS 的ID 是cxf。你要注意的是Apache
CXF2.2 的发行包中的jar 你如果直接全部放到lib 目录,那么你必须使用JDK1.6,否则会报JAX-WS 版本不一致的问题。对于JAXM & SAAJ 规范我们采用JDK 中自带的默认实现。
2 webservice落地实现
2.1 ApacheCXF实现webservice(jax-ws)
服务端代码
package com.michael.ws.service;
import javax.jws.WebService;
@WebService
public interface UserService {
public String sayHi(String name);
}
==================================================
package com.michael.ws.service.impl;
import com.michael.ws.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public String sayHi(String name) {
return "Hi," + name + ",Welcome to BeiJing!";
}
}
==================================================
package com.michael.ws;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.michael.ws.service.impl.UserServiceImpl;
public class Server {
public static void main(String[] args) {
// 服务工厂
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
// 设置服务地址
factory.setAddress("http://localhost:8000/user");
// 设置服务类
factory.setServiceBean(new UserServiceImpl());
// 添加日志输入输出拦截器
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
// 发布服务
factory.create();
// 提示
System.out.println("服务端启动");
}
}
客户端代码
package com.michael.ws.service;
import javax.jws.WebService;
@WebService
public interface UserService {
public String sayHi(String name);
}
==================================================
package com.michael.ws;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.michael.ws.service.UserService;
public class Client {
public static void main(String[] args) {
JaxWsProxyFactoryBean proxyFactoryBean = new JaxWsProxyFactoryBean();
proxyFactoryBean.setAddress("http://localhost:8000/user?wsdl");
proxyFactoryBean.setServiceClass(UserService.class);
UserService userService = proxyFactoryBean.create(UserService.class);
String result = userService.sayHi("Linux");
System.out.println("result = " + result);
}
}
webservice文档
调用服务端结果 记得添加log4j.properties
2022-06-16 23:01:00,123 11573 [tp2017085051-18] INFO serServiceImplPort.UserService - Inbound Message
----------------------------
ID: 1
Address: http://localhost:8000/user?wsdl
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {
Accept=[*/*],
Cache-Control=[no-cache],
connection=[keep-alive],
Content-Length=[193],
content-type=[text/xml; charset=UTF-8],
Host=[localhost:8000],
Pragma=[no-cache],
SOAPAction=[""],
User-Agent=[Apache CXF 3.0.1]
}
Payload:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:sayHi xmlns:ns2="http://service.ws.michael.com/">
<arg0>Linux</arg0>
</ns2:sayHi>
</soap:Body>
</soap:Envelope>
--------------------------------------
2022-06-16 23:01:00,247 11697 [tp2017085051-18] INFO serServiceImplPort.UserService - Outbound Message
---------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:sayHiResponse xmlns:ns2="http://service.ws.michael.com/">
<return>Hi,Linux,Welcome to BeiJing!</return>
</ns2:sayHiResponse>
</soap:Body>
</soap:Envelope>
--------------------------------------
调用客户端结果