web service
2020-03-19 本文已影响0人
十二找十三
1. 假设我们开发了一个web接口,想给别人用,我们要怎么办
1.部署接口到服务器
2.编写接口文档,写清楚接口是通过什么方法调的,输入参数是什么,输出参数是什么,错误时返回什么。
那问题来了,我们能不能只把接口部署到服务器上,然后接口不单能提供具体的服务,而且还能自动生成一份标准的接口文档,把接口信息都记录在该文档里,如果能做到,是不是能做到"接口即文档"的目的。
那么一个接口的信息包括哪些呢?
1.接口地址
2.接口调用方法
3.接口输入参数
4.接口输出参数
5.接口出错返回信息
6.....
soap webservice里wsdl文件就是接口描述信息。核心的信息就是以上几个。
2.
由于Web service是一个平台独立,
也就是说,使用接口的人不知道这个service是用什么技术开发的,
可能是php可能是java等,但接口的参数和返回的数据都是一样的,要达到这种目的,就需要两个东西,
一个是跟平台无关的数据格式,soap使用的是xml,一个是通信协议,也就是soap协议。
总结:准确的来说,webservice 不是一种技术,而是一种规范。是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互
服务端
<!--WerbService CXF依赖-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.5</version>
</dependency>
// 接口
package com.bc.mcode.v2;
import javax.jws.WebMethod;
import javax.jws.WebService;
import java.util.Map;
@WebService
public interface HelloWorld {
public User getUser(String userId);
@WebMethod(action = "getUserName")
public String getUserName(String userId);
public Map<String, User> getAllUserData();
}
// 实体类
package com.bc.mcode.v2;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -3628469724795296287L;
private String userId;
private String userName;
private String email;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", email='" + email + '\'' +
'}';
}
}
// 实现类
package com.bc.mcode.v2;
import javax.jws.WebService;
import java.util.HashMap;
import java.util.Map;
@WebService(endpointInterface = "com.bc.mcode.v2.HelloWorld",
serviceName = "HelloWorldService",
portName = "HelloWorldServicePort"
)
public class HelloWorldImpl implements HelloWorld {
private Map<String, User> userMap = new HashMap<String, User>();
public HelloWorldImpl() {
// 测试数据
User user = new User();
user.setUserId("1");
user.setUserName("cs1");
user.setEmail("cs1@163.xom");
userMap.put(user.getUserId(), user);
user = new User();
user.setUserId("2");
user.setUserName("cs2");
user.setEmail("cs2@163.xom");
userMap.put(user.getUserId(), user);
user = new User();
user.setUserId("3");
user.setUserName("cs3");
user.setEmail("cs3@163.xom");
userMap.put(user.getUserId(), user);
System.err.println("userMap==>" + userMap);
}
@Override
public User getUser(String userId) {
System.out.println("getUser");
return userMap.get(userId);
}
@Override
public String getUserName(String userId) {
System.out.println("getUserName");
return userMap.get(userId).getUserName();
}
@Override
public Map<String, User> getAllUserData() {
return userMap;
}
}
// 启动类
package com.bc.mcode.v2;
import javax.xml.ws.Endpoint;
public class Server {
protected Server() throws Exception {
// START SNIPPET: publish
System.out.println("Starting Server");
HelloWorldImpl implementor = new HelloWorldImpl();
String address = "http://localhost:8080/helloworld";
Endpoint.publish(address, implementor);
// END SNIPPET: publish
}
public static void main(String[] args) throws Exception {
new Server();
System.out.println("服务端已启动V2");
}
}
// 测试
浏览器 http://localhost:8080/helloworld?wsdl
客户端
axiom-api-1.2.20.jar
axiom-impl-1.2.20.jar
axis2-adb-1.7.6.jar
axis2-jaxws-1.7.6.jar
axis2-kernel-1.7.6.jar
axis2-transport-http-1.7.6.jar
axis2-transport-local-1.7.6.jar
commons-codec-1.2.jar
commons-httpclient-3.1.jar
commons-logging-1.1.1.jar
httpcore-4.4.4.jar
neethi-3.0.3.jar
woden-core-1.0M10.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.2.1.jar
// 搭建客户端测试
package com.ccbckj.test;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Demo2 {
public static void main(String[] args) {
testApp();
}
public static void testApp(){
String address = "http://localhost:8080/helloworld"; //
String qname = "http://v2.mcode.bc.com/"; // namespace
String methodName = "getUserName"; // 方法名字
Object[] params = new Object[]{"1"}; // 调用方法的参数
RPCServiceClient serviceClient;
try {
serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference reference = new EndpointReference(address);
options.setTo(reference);
QName name = new QName(qname, methodName);
Object[] re = serviceClient.invokeBlocking(name, params, new Class[]{String.class});
System.out.println(re[0]);
} catch (AxisFault e) {
e.printStackTrace();
}
}
}