项目需要开放一系列的API接口,然后就开始研究到底用什么方式开放比较好,网上比较流行的有传统的WebService方式,还有就是RestFul 风格的 API,经过一系列的评估,我还是决定采用RsetFul 风格的API比较好,
因为以前使用新浪微博的接口时,发现蛮好用的。
由于考虑到WebService 的广泛使用性,我就打算学习并使用一下WebSerice,了解才能做决定嘛
OK,言归正传
总体步骤:
步骤一:
创建普通的java项目
创建类
package net.itaem.test; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public class TestWebS { public String doString() { return "这是一个java6的WebService"; } public static void main(String[] args) { String url = "http://192.168.1.102:8081/net.itaem.test.TestWebS"; Endpoint.publish(url, new TestWebS()); } }
代码解析:
Endpoint.publish(url,new TestWebS());
该语句中,开启了一个服务,监听url中的端口,而代码头部(代码证的ip地址为本机地址,可以使用localhost或者127.0.0.1替代)
就好像Socket中的服务器端监听一样,监听该端口的访问。
@WebService
public class TestWebS {
使用注解说明了这是一个WebService实现接口类。
步骤二:
直接运行该类,如果在eclipse 下的话,
步骤三:
然后我们就可以通过地址访问了:
http://192.168.1.102:8081/net.itaem.test.TestWebS?wsdl
在浏览器输入该地址就可以得到
This XML file does not appear to have any style information associated with it. The document tree is shown below. <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://test.itaem.net/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://test.itaem.net/" name="TestWebSService"> <types> <xsd:schema> <xsd:import namespace="http://test.itaem.net/" schemaLocation="http://192.168.1.102:8081/net.itaem.test.TestWebS?xsd=1"/> </xsd:schema> </types> <message name="doString"> <part name="parameters" element="tns:doString"/> </message> <message name="doStringResponse"> <part name="parameters" element="tns:doStringResponse"/> </message> <portType name="TestWebS"> <operation name="doString"> <input message="tns:doString"/> <output message="tns:doStringResponse"/> </operation> </portType> <binding name="TestWebSPortBinding" type="tns:TestWebS"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="doString"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="TestWebSService"> <port name="TestWebSPort" binding="tns:TestWebSPortBinding"> <soap:address location="http://192.168.1.102:8081/net.itaem.test.TestWebS"/> </port> </service> </definitions>
步骤四:
生成客户端代码
打开cmd ,进入到 项目源码下的src目录执行
wsimport -p net.wsclient –keep http://192.168.1.102:8081/net.itaem.test.TestWebS?wsdl
PS:myeclipse查看源码路径
右击“src”文件夹,Propertites 弹出窗口右边,location:XXXX 就是源码所在的物理地址
回车
解析:
wsimport [–s "src目录" ] [–p “生成类所在包名”] [ -keep “wsdl发布地址”]
我们省略了 –s 目录,因为在同一个项目下面,如果不在同一个src (不在同一个项目)就需要使用这个 –s “src路径”
步骤五:
编写调用客户端代码的Test
package net.itaem.web.test; import net.wsclient.TestWebS; import net.wsclient.TestWebSService; public class TeatClint { /** * @param args */ public static void main(String[] args) { TestWebS testWebS = new TestWebSService().getTestWebSPort(); String returnContent = testWebS.doString(); System.out.println(returnContent); } }
运行:
解析:
其中 TestWebS 是客户端生成的代码,不是我们自己编写的代码,
而 TestWebSService 这个类是 根据我们自己的服务类 的 名字 +Service 后缀生成的,
方法getTestWebSport 也是同样的道理,命名方式 get+服务类名+Port
步骤五中这里所有操作的代码,都是自动生成的客户端代码
testWebS.doString();
这个方法是我们在服务类中定义的方法,
也就是说,这个服务类里面的所有方法,构成了我们开放出来的 api
是不是感觉很简单呢,
java6集成的最简单demo。
总结:
WebService是 和RPC很像,都是调用远程的类对象,然后生成输出。
客户端代码就好像我们Web中的DNS一样,给我们去查找对应的类所在, 和中间件中的ORB (对象请求代理)有点像,但这个封装得更彻底,更先进
在web的世界中,中间件的应用越来越依靠于HTTP,JSON,这类
考虑到传输速率问题,WebService是比RestFul的JSON输出快一点,
不过呢,性能不是非常延迟的时候,webService能不用就不要用了,因为这个东东使用得不好,代码很容易就冗余了,各种难维护