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();
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读