一、WebService是什么
WebService是一种跨语言跨平台的远程调用技术。所谓跨语言跨平台就是说服务端采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨平台则是指windows客户端可以调用Linux服务端,反之亦然。
二、相关技术
1、XML:可扩展编译语言,可以用来传递数据时soap的基础
2、soap:简单对象访问协议,WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头和XML内容格式就是SOAP协议。它是WebService的通讯协议。
SOAP协议=HTTP协议 + XML数据格式
3、WSDL:WSDL文件是一个XML文档,用于说明一组SOAP消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它,客户端要调用一个WEBService服务之前,要知道该服务的WSDL文件的地址。
WebService可以通过两种方式来暴露它的WSDL文件地址:
①注册到UUDI服务器,以便被人查找。②直接告诉客户端调用方。
4、Web服务体系结构:基于Web服务提供者、Web服务请求者、Web服务中介者。
三、发布WebService服务
JDK1.6中JAX-WS规范定义了如何发布一个WebService服务。与Web服务相关的类,都在java.jws.*包中。
@WebService,此注解用来某个类发布成一个WebService。
1、编写WebService的实体类
import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; /** * WebService规范JAX-Ws * * 该类为Web Service中的参数、返回值类型,故需要使用jaxb注解告诉cxf如何 * 在xml和Object之间处理 * 因为,SOAP消息包装的是一段XML代码,无论是服务端,还是客户端 * 在接收到SOAP消息时,都需要将XML转化为Java Object * 在发送SOAP消息时,需要将java Object转化XML */ @XmlRootElement(name="ImageCategory") public class ImageCategory implements Serializable { private String id;//主键id private String pId;//影像类型父id private String categoryCode;//影像类别code private String categoryName;//影像类别名称 public String getId() { return this.id; } public void setId(String id) { this.id=id; } public String getpId() { return this.pId; } public void setpId(String pId) { this.pId=pId; } public String getCategoryCode() { return this.categoryCode; } public void setCategoryCode(String categoryCode) { this.categoryCode=categoryCode; } public String getCategoryName() { return this.categoryName; } public void setCategoryName(String categoryName) { this.categoryName=categoryName; } }
2、编写WebService接口
package Service.webService; import model.ImageCategory; import javax.jws.WebService; import java.util.List; /** * Created by shuo on 2018/6/1. */ @WebService public interface WebServiceTestAPI { public String add(ImageCategory imageCategory); public String del(ImageCategory imageCategory); public String modify(ImageCategory imageCategory); public ImageCategory getOne(Long id); public List<ImageCategory> getList(String name); }
3、编写WebService实现类
import javax.jws.WebService; import java.util.ArrayList; import java.util.List; /** * Created by shuo on 2018/6/1. */ @WebService public class WebServiceTest implements WebServiceTestAPI { @Override public String add(ImageCategory imageCategory) { return "ADD SUCCESS"; } @Override public String del(ImageCategory imageCategory) { return "del SUCCESS"; } @Override public String modify(ImageCategory imageCategory) { return "modify SUCCESS"; } @Override public ImageCategory getOne(Long id) { ImageCategory imageCategory = new ImageCategory(); imageCategory.setCategoryCode("123456"); imageCategory.setCategoryName("猜猜我是谁" + "哈哈哈哈,我变了"); return imageCategory; } @Override public List<ImageCategory> getList(String name) { List<ImageCategory> imageCategoryList = new ArrayList<>(); ImageCategory imageCategory = new ImageCategory(); imageCategory.setCategoryCode("123456"); imageCategory.setCategoryName("猜猜我是谁"); imageCategoryList.add(imageCategory); return imageCategoryList; } }
4、发布服务
import javax.xml.ws.Endpoint; /** * Created by shuo on 2018/6/1. */ public class SoapServer { public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:80/webServiceTest", new WebServiceTest()); System.out.println("发布服务成功"); } }
浏览器输入http://127.0.0.1:80/webServiceTest?wsdl 看到如下界面,即wsdl文件,代码服务发布成功。
四、客户端调用WebService服务
客户端调用WebService服务的方法有很多,这里采用最简单的一种方式。
wsimport命令 这是java自带的一个命令。它的作用是将wsdl文件生成本地代理(java代码)方便调用。
语法 wsimport [opations] <wsdl_uri>
- wsdl_uri:wsdl 的统一资源标识符
- d :指定要输出的文件的位置
- s :表示要解析java的源码 ,默认解析出的是class字节码
- p : 指定输出的包名
在dos窗口执行如下命令
wsimport -s . -p com.test.ws.client http://127.0.0.1/webServiceTest?wsdl。会在com.test.ws.client包下生成一堆java代码。
将生成的一堆java文件导入客户端,编写客户端测试方法
public class MyClient { public static void main(String[] args) { WebServiceTestService webServiceTestService=new WebServiceTestService(); WebServiceTest webServiceTestPort = webServiceTestService.getWebServiceTestPort(); ImageCategory one = webServiceTestPort.getOne(1L); System.out.println(webServiceTestPort); System.out.println(one.getCategoryCode()); System.out.println(one.getCategoryName()); } }
输出结果如下:
五、总结
1、个人感觉这种方法麻烦啊,首先知道提供方给wsdl文件地址,然后用命令等生成一堆文件,导入客户端,然后才能调用。。
2、服务端改变方法的实现不影响客户端的调用,比如由“猜猜我是谁哈哈哈哈”变成“猜猜我是谁哈哈哈哈,我变了”等。
3、生成的那一堆文件中与服务提供方的对应关系是一个方法对应两个类。那么,问题来了,如果增加一个方法该怎么办?如何方法名变了又改怎么办?难不成客户端重新生成一堆文件,然后在导入客户端?!很显然这种方法存在一定的局限性。。。
下一篇博客将讲一讲采用其他方式进行客户端的调用等。