WebService入门初使用(二)调用WebService服务

前言

上一节记录完WebService的创建,鉴于篇幅所致,将调用部分单独拿到本节,所调用WebService服务基于上一章节内容。

相关推荐 WebService入门初使用(一)创建WebService服务

客户端-调用(Java)

服务发布成功了,如何调用呢?请看说明书-WSDL:

任何一个服务在地址栏输入服务地址加?wsdl 如:http://127.0.0.1:6789/hello ?wsdl

目前不是访问webService,只是获取一个用于描述WebService的说明文件,即:wsdl文件.

wsdl- WebService Description Language,是以XML文件形式来描述WebService的”说明书”, 有了说明书,我们才可以知道如何使用或是调用这个服务。

wsimport生成客户端java文件

在cmd中输入类似示例的命令,其中网站部分(http)根据实际情况更改称成自己要调用的WebService的地址:

e:/>wsimport –s . http://localhost:8080/webservice/HelloWorld?wsdl

注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。(注意.前后有空格)

如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。

.class代码,可以经过打包以后使用。java代码可以直接Copy到我们的项目中运行。

生成的代码:

wsimport.exe简介

wsimport.exe是jdk自带的,可以根据wsdl文档生成客户端调用java代码,当然如果是用其他语言的类似工具,解析wsdl后将会生成对应语言的代码,这里只是用java为例子,注意这些代码不是通过服务端下载的,而是通过解析wsdl生成对应java文件(就是一个本地IO)。 wsimport.exe位于JAVA_HOME\bin目录下. 常用参数为: -d<目录> - 将生成.class文件。默认参数。 -s<目录> - 将生成.java文件。 -p<生成的新包名> -将生成的类,放于指定的包下:-p com.intsmaze.demo (wsdlurl) - http://server:port/service?wsdl,必须的参数。

然后只需要根据wsdl文件提供的信息调用生成类提供的方法。建议从下往上看。

简析wsdl文件

以下内容均为对照java接口调用——webservice就是一个RPC而已,所得结果。所有为注释的单行,若无注明均为对上一行的注释。

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:tns="HelloSevice"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
 name="HelloserServiceImplService" 
targetNamespace="HelloSevice">
//这是服务端的包结构,一般来说通过注解修改最多,不要暴露出去!(上面那个网站说的,具体不太清楚)
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="HelloSevice" 
elementFormDefault="unqualified" targetNamespace="HelloSevice" version="1.0">
<xs:element name="say" type="tns:say"/>
<xs:element name="sayResponse" type="tns:sayResponse"/>
<xs:complexType name="say">
<xs:sequence>
<xs:element minOccurs="0" name="str" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sayResponse">//6,子元素说明了它的类型,已经是参数还是返回值
<xs:sequence>
<xs:element minOccurs="0" name="Resultstr" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="say">
<wsdl:part element="tns:say" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="sayResponse">//5,通过element可以知道参数类型
<wsdl:part element="tns:sayResponse" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:portType name="IHelloSevice">//3,找到标签它的子元素就是提供的方法
<wsdl:operation name="say">//方法名
<wsdl:input message="tns:say" name="say"></wsdl:input>
//4,输入参数,通过message的属性可以知道参数类型,但是如果生成本地代码,通过调用函数就可以知道参数类型了。
<wsdl:output message="tns:sayResponse" name="sayResponse"></wsdl:output>
//输出参数
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HelloserServiceImplServiceSoapBinding" type="tns:IHelloSevice">
//2,根据type的属性找到对应的标签
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="say">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="say">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sayResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloserServiceImplService">//服务的名称,创建具体服务对象。
<wsdl:port binding="tns:HelloserServiceImplServiceSoapBinding" //1,根据这个名称找到对应的标签
		name="HelloserServiceImplPort">
//服务对象调用getHelloserServiceImplPort()获取端口返回服务接口。
<soap:address location="http://localhost:8080/webservice/HelloWorld"/>

创建测试类

将第一步导出的java文件导入客户端项目,并创建如下测试类

package cn.wind.WebServiceC.controller;

import cn.wind.webservicee.webservices.HelloserServiceImplService;
import cn.wind.webservicee.webservices.IHelloSevice;

/**
 * Created by wind on 2016/11/15.
 */
public class ddd {
    public static void main(String[] args) {
        /**
         * <wsdl:service name="HelloserServiceImplService">
         */
        HelloserServiceImplService hss = new HelloserServiceImplService();
        /**
         *
         * <wsdl:port binding="tns:HelloserServiceImplServiceSoapBinding" name="HelloserServiceImplPort">
         * <wsdl:binding name="HelloserServiceImplServiceSoapBinding" type="ns1:IHelloSevice">
         */

        IHelloSevice soap = hss.getHelloserServiceImplPort();
        String str = soap.say("intsmaze",1);//这里我们看视乎在调用我们本地的方法,其实内部把发送数据组装为soap协议,
        //然后把数据发送到了服务端,服务端的线程接收到请求处理返回了数据。
        System.out.println(str);
    }
}

若成功,将出现如下效果:

相关下载

点击下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java进阶架构师

02:SpringBoot整合SpringDataJPA实现数据库的访问(一)

Spring Data JPA等于在ORM之上又进行了一次封装,但具体的对数据库的访问依然要依赖于底层的ORM框架,Spring Data JPA默认是通过Hi...

741
来自专栏章鱼的慢慢技术路

错误代码CS0051可访问性不一致_解决方案

本来对BaseStruct设置为私有访问,但调用时又想公开化,从而造成了编译错误。

1192
来自专栏企鹅号快讯

Java Web 模板代码生成器的设计与实现

起因 项目中需要根据数据库表写很多Meta、Dao、Service代码,其中很多代码都是重复而繁琐的。因此如果有一个模板代码的生成器,就可以一定程度提高开发效率...

28310
来自专栏大内老A

并发中的同步--WCF并发体系的同步机制实现

在《WCF 并发的本质》中,我们谈到了WCF提供的三种不同的并发模式,使开发者可以根据具体的情况选择不同的并发处理的策略。对于这三种并发模式,Multiple采...

1865
来自专栏Java 技术分享

Struts2 学习之小白开始

3196
来自专栏学海无涯

Java Web之MySQL在项目中的使用

尴尬:access denied for user ’root’@’localhost’ using password yes 有时候,在连接 MySQL 数据...

2746
来自专栏Jed的技术阶梯

Kafka 新版消费者 API(一):订阅主题

说明:这两个参数分别指定了 TCP socket 接收和发送数据包的缓冲区大小。如果它们被设为 -1,就使用操作系统的默认值。如果生产者或消费者与 broker...

9042
来自专栏bboysoul

ubuntu使用sslocal连接shadowsocks

今天更新了一下系统,更新了一个包libqtshadowsocks,之后shadowsocks-qt5就打不开了,在网上也没有找到低版本的这个包,报错信息如下

6451
来自专栏Linyb极客之路

分布式框架之Dubbo学习小记

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包括:

1372
来自专栏Golang语言社区

GDB使用详解

一、打开GDB 1、gdb filename 加载该文件到gdb 2、gdb file filename 如果gdb filename失败,可以在打开gd...

35910

扫码关注云+社区

领取腾讯云代金券