WebService基础使用(一)

WebService**

WebService简介

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

服务端实现

1.编写接口及其实现类

public interface HelloService{
    public String sayHello(String name);
}
public class HelloServiceImpl implements Service{
 	@Override
    public String sayHello(String name) {
        return name+"Welcome";
    }
}

2.发布

public class ServiceServer {
    public static void main(String[] args) {
        Endpoint.publish("http://127.0.0.1:8001/user", new ServiceImpl());
    }
}

访问http://127.0.0.1:8001/user?wsdl 服务发布是否成功

客户端实现

1.创建一个客户端空项目,cmd命令行进入此项目的src目录 使用以下命令生成客户端代码

wsimport -s . http://127.0.0.1:12345/user?wsdl

2.编写客户端

  • 创建服务视图,视图是从wsdl文件的service标签的name属性获取

  • 获取服务实现类,实现类从wsdl文件的portType的name属性获取

  • 获取查询方法,从portType的operation标签获取

    public class Client {
    public static void main(String[] args) {
        HelloServiceImplService helloServiceImplService = new HelloServiceImplService();
        HelloService helloService = helloServiceImplService.getPort(HelloService.class);
        String result = helloService.sayHello("小明");
        System.out.println(result);
    }
}

但是在标准开发中,我们一般采用

        //获取wsdl文档资源地址
        URL wsdlDocumentLocation = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
        //获取服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务视图名
        QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS");
        Service service=Service.create(wsdlDocumentLocation, serviceName);
        //获取服务实现类
        com.project.mobile.MobileCodeWSSoap mobileCodeWSSoap = service.getPort(com.project.mobile.MobileCodeWSSoap.class);
        //调用方法
        String result = mobileCodeWSSoap.getMobileCodeInfo("",null);
        System.out.println(result);
        String str = null;

**该种方式可以自定义命名空间,服务视图名等元素,方便以后维护,是一种标准的开发方式 **。

WSDL

WSDL(Web Services Description Language), web服务描述语言,他是webservice服务端使用说明书,说明服务端接口、方法、参数和返回值,WSDL是随服务发布成功,自动生成,无需编写。

Service:相关端口的集合,包括其关联的接口、操作、消息等。

Binding:特定端口类型的具体协议和数据格式规范

portType: 服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType

message: 定义一个操作(方法)的数据参数

types: 定义 web service 使用的全部数据类型

阅读方式

WSDL文档应该从下往上阅读。

1.先看service标签,看相应port的binding属性,然后通过值查找上面的binding标签。

2.通过binding标签可以获得具体协议等信息,然后查看binding的type属性

3.通过binding的type属性,查找对应的portType,可以获得可操作的方法和参数、返回值等。

4.通过portType下的operation标签的message属性,可以向上查找message获取具体的数据参数信息。

SOAP

SOAP即简单对象访问协议,他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。

SOAP=http+xml

SOAP结构

必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息

可选的 Header 元素,包含头部信息

必需的 Body 元素,包含所有的调用和响应信息

可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

WebService的注解都位于javax.jws包下:

@WebService

定义服务,在类上边

targetNamespace:指定命名空间

name:portType的名称

portName:port的名称 获取服务实现类 集成java接口的实现类

serviceName:服务名称 获取服务 一般对应java中的接口

endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。

@WebMethod

定义方法,在公开方法上边

operationName:方法名

exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false

@WebResult

定义返回值,在方法返回值前边 name:返回结果值的名称

@WebParam

定义参数,在方法参数前边 name:指定参数的名称

@WebService(
        targetNamespace="http://service.cad.com",
        portName="WeatherSOAPPort",
        serviceName="WeatherWSService",
        name="WeatherSOAP"
)
public class WeatherInterfaceImpl implements WeatherInterface {

    @Override
    @WebMethod(
            operationName="getWeather",
            exclude=false
    )
    public @WebResult(name = "weatherResult") String queryWeather(@WebParam(name = "city") String cityName) {
        System.out.println("城市名称"+cityName);
        String weather = "暴雨如画";
        return weather;
    }
}

spring项目或者springboot项目中引入了cxf的jar后可以使用

Wsdl2java

命令是CXF提供的生成客户端的工具,他和wsimport类似,可以根据WSDL生成客户端代码

Wsdl2java常用参数:

-d,指定输出目录

-p,指定包名,如果不指定该参数,默认包名是WSDL的命名空间的倒序

Wsdl2java支持SOAP1.1和SOAP1.2

wsdl2java -p com.project.cxf -d . http://127.0.0.1:8001/user?wsdl

集成jax-ws规范,jax-rs规范以及与spring结合的项目实例参考地址:

https://gitee.com/alancci/webservice

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值