1、什么是webservice
先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于webservice的服务端,我们的系统就相当于客户端。如http://www.webxml.com.cn这个网站上面就列举了多个webservice服务站点
2、JAVA中如何调用别人发布的webservice
2.1、获取webservice的wsdl文档
2.11、什么是wsdl文档
wsdl跟java一样,也是一种语言,是通过xml的形式说明该webservice如何调用。
2.12、如何获取wsdl文档
通过在webservice的url后面加?wsdl的方式,比如天气预报的的就是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
2.13、WSDL解析
Wsdl文档从下往上读
Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。(入参和出参的数据类型)
Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。
Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。
PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)。
Binding - 特定服务访问点与具体服务类的绑定(不看内容,看关系)。
Port - 定义为webservice单个服务访问点。
Service- 相关服务访问点的集合。
2.2、通过wsdl文档生成客户端调用代码
2.21、使用jdk自带的命令生成
配置java环境变量后在命令窗口中输入wsimport –s . http://xxxx.xx.xx/xxx?wsdl即可生成java代码
注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。.class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行
注意:可能会报错解析组件 ‘s:schema’ 时出错。在该组件中检测到 's:schem’之类的,如果报错这个请移步:这里
2.3、生成代码后如何调用
先把生成的代码复制到项目中,然后通过读wsdl文档来调用,整体的调用代码类似于下面这样
//wsdl文档中service的name
SayHelloIntefaceService ss = new SayHelloIntefaceService();
//wsdl文档中portType的name
SayHelloInteface shf=ss.getSayHelloIntefacePort();
//wdl文档中complexType的name
String str=shf.sayhellow(“lisi”);
//str即为webservice的服务端返回的信息
System.out.println(str);
3、一个关于WebService的Demo
3.1、服务端
package com.bxoon;
import javax.jws.WebMethod;
public interface WebServiceI {
@WebMethod(exclude=true)
String helloWord(String name);
@WebMethod(exclude=true)
String helloWord2(String name);
}
package com.bxoon;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class HelloWebService implements WebServiceI {
@Override
public String helloWord(String name) {
return"Hello: "+name;
}
@Override
public String helloWord2(String name){
return"Hello: "+name;
}
public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:8080/helloWord",new HelloWebService());
}
}
3.2 客户端
服务端启动之后通过访问http://127.0.0.1:8080/helloWord?wsdl来得到一个wsdl文档,类似于如下
然后通过命令:
wsimport -s . http://127.0.0.1:8080/helloWord?wsdl
我们把对应的java类copy到客户端项目中,得到这样的目录结构
然后我们编写图中的Client类,代码如下
package com.bxoon;
public class Client {
public static void main(String[] args) {
HelloWebServiceService service = new HelloWebServiceService();
HelloWebService webService = service.getHelloWebServicePort();
String result = webService.helloWord("11");
System.out