WebService通信简易实现

WebService

一 WS简介

ws是一种基于Http协议和XML技术,并使用WSDL描述和使用SOAP协议传输的异构系统解决方案

1.1Ws 直译网络服务,是RPC的一种实现方式

RPC–远程过程调用协议

Ws采用XML

1.2 使用场景

1.由权威机构提供的第三方小功能

​ 权威机构能偶获取一些普通没法获取的数据,然后把它封装成ws服务端,普通使用就作为ws客户端掉用服务端。

2.多种客户端整合

​ 大型应用公司为提高影响力,它会针对不同的平台提供不同的客户端。而客户端需要掉用获取数据,使用RPC,WS就是一种实现方式

3.异构系统整合

①异构系统可以简单理解为不同语言开发或不同架构多个系统

​ ----异构系统中相互作为ws服务端和客户端?问题-侵入性太强

​ 1.新增一个的时候其他系统都要改代码

​ 2.一个系统改动ip后,其他也要改动

②soa:面向服务架构

​ wsdl:描述服务

​ uddi:发现服务

​ soap:调用服务协议

二 jdk ws实现

2.1 引入

​ ws只是思想,jdk有默认实现。而且第三方框架也有实现。

2.2 ws服务端

​ 1.创建项目

​ 2.创建本地服务接口和实现类

public class HelloServiceImpl {
	public String sayHello(String name) {
        return name+"hello";
    }
}

​ 3.把本地服务标记为远程服务

​ @WebService

@WebService//标记为远程服务
public class HelloServiceImpl {
    @WebMethod//标记为远程服务的远程方法
    public String sayHello(String name) {
        return name+"hello";
    }
}

​ 4.发布服务-根据注解做一些事情

 public static void main(String[] args){
        //Endpoint是终端的意思
        String address  ="http://127.0.0.1:8010/hello";//发布地址
        Object implementor=new HelloServiceImpl();//发布服务
        Endpoint.publish(address,implementor);
        System.out.println("服务发布成功!");
    }

​ 5.测试

http://127.0.0.1:8010/hello?wsdl

​ 注意事项:

​ 1.jdk1.8不能直接访问服务地址,要加上?wsdl

​ 2.没有抱错,不展示内容,浏览器兼容性问题

​ 3.localhost 127.0.0.1 局域网ip 只要有一个成功就ok

2.3wsdl简介

1.是什么

​ web service description language 网络服务描述语言。简单的理解就是用来描述服务

2.结构

​ definitions:根

​ name:服务名称,类型+service

​ targetNamespace:http://倒置导包

​ service:服务接口

服务在哪个地址被掉用

​ binding:

​ transport:以什么样的传输协议来调用

​ style=“document”:表示我们wsdl文件遵循什么格式 document/rpc

​ portType:接口类型

​ 描述了有哪些接口方法

​ message:消息

​ 描述接口方法的参数和返回值消息

​ types:描述消息的类型和名称-在doucement才有,而rpc没有

归纳:

接口实现归纳法

​ 接口:portType,message,types

​ 实现:service,binding

3W

​ where:service—什么地址

​ how:binding—什么方式

​ what:portType,message,types—什么方法

​ wsdl描述服务有哪些方法,以及在什么地址以什么样的方式能够被掉用

2.4 ws客户端

1.创建项目

2.通过wsdl地址生成本地接口

​ jdk的一个工具wsimport-jdk\bin,想在任意路径掉用,需要配置path

wsimport -d . http://127.0.0.1:8010/hello?wsdl

​ 生成的是class文件

wsimport -s . http://127.0.0.1:8010/hello?wsdl

​ 生成Java文件

​ 注意:不要关闭服务端,该空格的地方注意

3.通过生成一些类获取本地接口的代理对象

4.通过该本地代理对象的方就能完成掉用服务

//获取本地接口代理对象
HelloServiceImpl helloService = new HelloServiceImplService().getHelloServiceImplPort();
System.out.println(helloService.getClass());
//通过代理对象掉用远程服务方法
System.out.println(helloService.sayHello("lwtest"));

2.5 soap简介

1.是什么

​ simple object access protocol:简单对象访问协议

2.验证

<?xml version="1.0" endoding="UTF-8">

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://webservice.zengqiang.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMlSchema-instance">
	<soapenv:Header>
		<authInfo>
			<userName>userName>
		authInfo>
	soapenv:Header>
	<soapenv:Body>
		<q0:sayHello>
			<arg0>zengqiangtestarg0>
		q0:sayHello>
	soapenv:Body>
soapenv:Envelope>

<S:envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
	<S:Body>
		<ns2:sayHelloResponse xmlns:ns2="http://webservice.zengqiang.com/">
			<return>zengqiangtest:helloreturn>
		ns2:sayHelloResponse>
	S:Body>
S:Envelope>

​ Envelope:信封

​ Header:信封头部,开发人员用,我们需要从客户端往服务端传递一些数据懂得时候用,比如权限信息

​ Body:主体,一般是系统自己用

​ 对于请求而言,告诉要掉用的方法和参名及值

​ 对于相应而言,告诉是对哪个方法掉用进行相应,以及返回值的名称和值

最终实现和注解

服务端–接口
/**
 * @WebService:
 *  只要你在某接口上添加了@WebService,name在所有的方法上面都会加上@WebMethod
 *  operationName = "sayHello"修改暴露的方法名
 *  exclude = true 排除方法
 *  @WebParam(name = "name") 修改参数名称
 *  @WebResult(name = "ret") 修改返回值名称
 *
 * @author Wangjinghao
 * @version v1.0.0
 * @date 2019/6/10
 */
@WebService(targetNamespace = "http://lw.org")
@SOAPBinding(style = SOAPBinding.Style.RPC)//默认是document,rpc少了一些类型
public interface IHelloService {
    @WebMethod
    @WebResult(name = "ret")String sayHi(@WebParam(name = "name") String name);

    @WebMethod(operationName = "sayHello",exclude = true)
    String sayHi1(String name);
}
服务端–实现类
/**
 * WebService标识是一个远程服务类
 * endpointInterface接口,配置了改哦束胸接口上面也要配置webService
 * serviceName = "helloservice" 服务名
 * portName = "helloServicePort" 端口名
 * targetNamespace = "http://lw.org" 限定名,实现类改动接口中也要跟着改
 * @author Wangjinghao
 * @version v1.0.0
 * @date 2019/6/10
 */

@WebService(endpointInterface = "cn.itsource.ws.jdk.server02_tag.IHelloService"
            ,serviceName = "helloservice",portName = "helloServicePort",targetNamespace = "http://lw.org")
public class HelloServiceImpl implements IHelloService {
    @Override
    public String sayHi(String name) {
        return name+"say hello!";
    }

    @Override
    public String sayHi1(String name) {
        return null;
    }
}
客户端–接口(生成)
/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.9-b130926.1035
 * Generated source version: 2.2
 * 
 */
@WebService(name = "IHelloService", targetNamespace = "http://lw.org")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface IHelloService {


    /**
     * 
     * @param name
     * @return
     *     returns java.lang.String
     */
    @WebMethod
    @WebResult(name = "ret", partName = "ret")
    @Action(input = "http://lw.org/IHelloService/sayHiRequest", output = "http://lw.org/IHelloService/sayHiResponse")
    public String sayHi(
        @WebParam(name = "name", partName = "name")
        String name);
}
客户端–实现类(生成)
/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.9-b130926.1035
 * Generated source version: 2.2
 * 
 */
@WebServiceClient(name = "helloservice", targetNamespace = "http://lw.org", wsdlLocation = "http://127.0.0.1:9999/hi?wsdl")
public class Helloservice
    extends Service
{

    private final static URL HELLOSERVICE_WSDL_LOCATION;
    private final static WebServiceException HELLOSERVICE_EXCEPTION;
    private final static QName HELLOSERVICE_QNAME = new QName("http://lw.org", "helloservice");

    static {
        URL url = null;
        WebServiceException e = null;
        try {
            url = new URL("http://127.0.0.1:9999/hi?wsdl");
        } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
        HELLOSERVICE_WSDL_LOCATION = url;
        HELLOSERVICE_EXCEPTION = e;
    }

    public Helloservice() {
        super(__getWsdlLocation(), HELLOSERVICE_QNAME);
    }

    public Helloservice(WebServiceFeature... features) {
        super(__getWsdlLocation(), HELLOSERVICE_QNAME, features);
    }

    public Helloservice(URL wsdlLocation) {
        super(wsdlLocation, HELLOSERVICE_QNAME);
    }

    public Helloservice(URL wsdlLocation, WebServiceFeature... features) {
        super(wsdlLocation, HELLOSERVICE_QNAME, features);
    }

    public Helloservice(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public Helloservice(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
        super(wsdlLocation, serviceName, features);
    }

    /**
     * 
     * @return
     *     returns IHelloService
     */
    @WebEndpoint(name = "helloServicePort")
    public IHelloService getHelloServicePort() {
        return super.getPort(new QName("http://lw.org", "helloServicePort"), IHelloService.class);
    }

    /**
     * 
     * @param features
     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the features parameter will have their default values.
     * @return
     *     returns IHelloService
     */
    @WebEndpoint(name = "helloServicePort")
    public IHelloService getHelloServicePort(WebServiceFeature... features) {
        return super.getPort(new QName("http://lw.org", "helloServicePort"), IHelloService.class, features);
    }

    private static URL __getWsdlLocation() {
        if (HELLOSERVICE_EXCEPTION!= null) {
            throw HELLOSERVICE_EXCEPTION;
        }
        return HELLOSERVICE_WSDL_LOCATION;
    }
}

三 CXf

优点:

SOA框架,ws只会用到XFire

CXF内置JEtty Web服务器

使用CXF开发Web Server端组件都需要“接口”和“实现类”两部分

支持多种数据格式:XML和JSON(Restful)

并可以余spring进行快速无缝的整合

灵感或的部署:ant maven

可以运行有Tomcat,Jboss,Jetty(内置web服务器),IBMWebsphere,BeaWebLogic上面

​ --作者:额滴神

你可能感兴趣的:(Java)