首先必须要了解web service是什么。web service这个词的字面意思是网络服务。既然是网络服务那么就一定有服务对象。个人认为web service的服务对象就是我们的应用程序,应用程序可以调用web service所提供的服务来帮助实现应用程序想要实现的功能。举个例子来说,比如某个应用程序希望实现天气预报的功能,但开发这样的功能需要耗费不少的资源包括人力、物力。那么我们能不能直接使用别人开发好的程序来实现我们想要实现的天气预报功能呢?答案是肯定的,那就是web service。目前有很多网站提供web service的服务,提供天气预报功能的web service有很多。web service最大的优势是跨平台,跨语言。不管所提供的服务是用什么语言写的,也不管调用程序是用什么语言写的,都可以实现相互通信。那么怎么调用web service呢?我们怎样才能把自己应用程序的功能封装成一个web service,它具体是怎么实现的呢?
web service的核心是soap和wsdl。soap(simple-object-access-protocol)简单对象访问协议,它是基于XML语言的用于网上传输的协议,soap以http协议为基础。简单来说,soap就是http + xml。通过soap协议就可以实现两个应用程序之前的通信,而wsdl(web_service_discription_language)网页服务描述语言。它是用来描述web服务的一个xml文档。
如上图所示<opration name="sayHi">指的是web service所提供的方法。<service name="HelloServiceService">指的是service的名称,而<soap:address location="">表示service所在的地址。通过访问http://localhost:9999/hello?wsdl就可以访问该服务的wsdl。就可以看到如上所示的wsdl。
下面简单些一个基于jdk的webservice。
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class HelloService {
public String sayHello(String name){
System.out.println("sayHello()...");
return "hello " + name;
}
public String sayHello2(String name){
return "hello " + name;
}
public static void main(String[] args) {
/**
* 参数1:服务的发布地址
* 参数2:服务的实现者
*/
Endpoint.publish("http://192.168.1.55:8888/hello", new HelloService());
System.out.println("Server ready...");
}
}
上面就是一个用java实现的发布一个服务。如上例所示,实现一个简单的webService只要在类的上面加上注释@webService,而sayHello()则是这个服务所提供的方法以供调用。使用Endpoint的publis()方法就可以将服务发布出去,发布地址为http://192.168.1.55:8888/hello。现在访问http://192.168.1.55:8888/hello?wsdl就可以看到wsdl文件。
当看到wsdl文件时就证明现在服务可以被调用。那么该如何调用这一服务呢,调用一个服务有多种方式。最为常用的是使用jdk提供的命令,根据wsdl文件可以生成相应的java代码。使用自动生成的java代码就可以实现对服务的调用。
如上图所示,在命令行输入 wsimport -s . +wsdl文件地址就可以自动生成java代码,所生成的java代码被存储在当前目录文件中。
上图的所有代码都是由jdk命令自动生成。将所有的java文件拷入项目中。并新建一个java类,如下:
public class HellowService {
public static void main(String[] args){
HelloServiceService hss = new HelloServiceService();
HelloService service = hss.getHelloServicePort();
String resultString = service.sayHello2("leo");
System.out.println(resultString);
}
}
通过上述方式就可以调用web service所提供的sayHello2方法。