第一个问题:什么是webservice?
第二个问题:webservice可以干什么?
第三个问题:怎么开始webservice?
我相信,世界上很多的事物都让人产生这三个方面的疑问?正如:我是谁?我从哪里来?我到哪里去?
今天研究了以下webservice和RPC,看看这俩个东西究竟可以干什么,此篇博客记录学习webservice的路程,稍后以一个小demo进行入门级程序的编写。
我们首先来回答第一个问题:什么是webservice?
一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
比如:我局域网内有两台主机,ip分别是192.168.1.100和192.168.1.101,分别归小张和小王使用,小张调用小王写的函数,这个过程叫做webservice。放飞思维,我在沈阳调用一个在北京的朋友主机上的函数更是webservice了。
第二个问题:webservice可以干什么?
比如:一个大型企业开发的服务作为接口暴露出来,那么好了,个人只要遵循该企业的规则就可以调用企业的接口。支付宝相信大家都熟悉,许多第三方网站上都有支付宝的调用接口,怎么实现的,毫无疑问:webservice。类似的还有pos机。
第三个问题:怎么开始webservice?
其实websercie分为两个方面:server端和client端,server端把服务开发好后,将该服务的接口发布出来,client端调用该接口就可以实现webservice。当然,我说这个是最简单的流程,其实这个过程很复杂,我向来喜欢大道至简的原则,争取做到让一个小白在看完这篇博客之后马上能明白什么是webservice。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
webserice其实已经很成熟了,有许多开发框架,今天我们就用jdk自带的框架来开发webservice。
咱们以一个例子开始:
首先,必须server端必须开发并发布服务,导入jws框架,发布的地址是192.168.1.100:
package cn.edu.lnu.webservice;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class Function {
public String transWords(String words){
String res = "";
for(char ch : words.toCharArray()){
res += ch+",";
}
return res;
}
public static void main(String[] args) {
// 使用Endpoint(终端)类发布webservice
//Endpoint.publish("http://localhost:8089/service/function", new Function());
Endpoint.publish("http://192.168.1.100:8089/service/function", new Function());
System.out.println("Publish Success");
}
}
怎么发布?运行main函数即可,运行之后,console打出“Publish Sucess",这时候我们去浏览器中输入该网址,结果如下图“
Web Services
Endpoint Information
Service Name: {http://webservice.lnu.edu.cn/}FunctionService
Port Name: {http://webservice.lnu.edu.cn/}FunctionPort
Address: http://192.168.1.100:8089/service/function
WSDL: http://192.168.1.100:8089/service/function?wsdl
Implementation class: cn.edu.lnu.webservice.Function
点击超链接,内容如下“
<definitions targetNamespace="http://webservice.lnu.edu.cn/" name="FunctionService">
<types>
<xsd:schema>
<xsd:import namespace="http://webservice.lnu.edu.cn/" schemaLocation="http://192.168.1.100:8089/service/function?xsd=1"/>
</xsd:schema>
</types>
<message name="transWords">
<part name="parameters" element="tns:transWords"/>
</message>
<message name="transWordsResponse">
<part name="parameters" element="tns:transWordsResponse"/>
</message><portType name="Function"><operation name="transWords">
<input wsam:Action="http://webservice.lnu.edu.cn/Function/transWordsRequest" message="tns:transWords"/>
<output wsam:Action="http://webservice.lnu.edu.cn/Function/transWordsResponse" message="tns:transWordsResponse"/>
</operation></portType><binding name="FunctionPortBinding" type="tns:Function">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="transWords"><soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output></operation>
</binding>
<service name="FunctionService">
<port name="FunctionPort" binding="tns:FunctionPortBinding">
<soap:address location="http://192.168.1.100:8089/service/function"/>
</port>
</service>
</definitions>
这东西是啥?wsdl,基于xml的webservice描述语言。这样server端就发布成功了!
现在192.168.1.101这台主机上的程序想访问这个服务,怎么做?
新建个项目,运行命令窗口,键入以下命令
wsimport -s ./workspace/wsclient -p cn.edu.lnu.client -keep http://localhost:8089/service/function?wsdl
client只建项目即可,其他不用做,命令执行,刷新项目,会出现几个java文件,这些就是代理文件,新建一个测试类,输入如下代码:
package cn.edu.lnu.test;
import cn.edu.lnu.client.Function;
import cn.edu.lnu.client.FunctionService;
public class ClientTest {
public static void main(String[] args) {
Function ft = new FunctionService().getFunctionPort();
String result = ft.transWords("love");
System.out.println(result);
}
}
程序打印 l o v e
大家可以看到,我在101这台主机上压根就没有写方法,方法的调用是srver端的transord(),这就是一个简单的webservice小程序!