谈谈WebService开发-基础篇

来源:互联网 发布:erp系统数据录入 编辑:程序博客网 时间:2024/05/20 13:07

        最近经常有些网上的朋友问起WebService的开发,这里就我个人的理解做个简明介绍与总结。该篇主要介绍WebService涉及的一些基础:

  • WebService的必要性;
  • Schema规范与Http协议
  • 重要述语;
  • 开发WebService的步骤;


WebService的必要性

       对于这个能回答以下面两个问题,个人觉得就能理解它的必要性了:

      1.什么是WebService;

       顾名思义,WebService就是基于Web的服务,服务器端提供一些资源可以让应用访问;是一个跨语言,跨平台的规范;多个跨平台,跨语言的应用间通信的解决方案;

      2.为什么要用WebService;

       试想下以下应用场景 A应用---用java开发,运行在windows平台,List<Address>  getAllAddress();

                                            B应用---用C语言开发,运行在linux平台,B应用现在要获取A应用的所有的Address信息;

      总结:WebService可以解决跨语言跨平台远程调用

Schema规范与Http协议

Schema规范是用来约束XML文件的书定格式的,Schema文件是以.xsd作为后缀的,Schema规范中需要掌握以下几点:

  1. 所有的标签与属性均需要在Schema文件中定义,schema标签本身是由w3c组织来定义的;
  2. 每个Schema文件都必须有一个ID,这里称为namespace即命名空间;
  3. targetnamespace 用以标识当前schema的namespace; 
  4. 由xmlns 来引用schema,xmlns的值是引用的schema的namespace,当引用N个schema时需要有至少N-1个别名,别名的格式如“xmlns:ddd” ; 
  5. 对于非w3c组织定义的schema,需要指定引用的schema的位置,schemaLocation就是 用以说明引用的schema的位置信息。


Http协议,需要理解以下几点:

  1. 请求的组成,一个请求行[请求方法(post/get),path,协议版本(http1.1)];多个请求头;请求体(只有post方法有);
  2. 响应的组成,响应状态行[需要了解常用的状态码200,404,500,302等];
  3. 请求响应的过程,了解一下http1.0与http1.1的区别,1.0一个连接只能请求一个资源,现在已经基本不用了,具体过程如下图:
    


重要述语

  • WSDL:Web Service Definition Language 对应一种后缀为.wsdl文件,一个webservice对应一个唯一的wsdl文档,它定义了客户端与服务器端进行交互的请求与响应的数据格式;
  • SOAP:Simple Object Access Protocal 简单对像访问协议;实际上就是http+xml片断;依赖于WSDL文档的定义;
  • SEI:Service EndPoint Interface web service的终端接口,就是服务器端用来处理请求的接口(其中的方法就是处理请求的方法);


开发WS的步骤

       开发手段可以采用源生的JDK进行开发,建议1.6以上JDK;当然工作中一般可能会借助其它webservice框架来进行开发,常用的有CXF,AXIS2等;这里先以源生的JDK来进行开发一个简单demo以示步骤:
       1.创建服务器端工程Webservice-jdk-server,并新建接口ISayHello.java,即创建SEI。
package com.devins.ws.server.service;import javax.jws.WebMethod;import javax.jws.WebService;/** *  * SEI定义 * */@WebServicepublic interface ISayHello {@WebMethodpublic String sayHello(String name);}

      2.新建接口实现类:
package com.devins.ws.server.service.impl;import javax.jws.WebService;import com.devins.ws.server.service.ISayHello;/** * SEI实现 */@WebServicepublic class SayHelloImpl implements ISayHello{@Overridepublic String sayHello(String name) {// TODO Auto-generated method stubSystem.out.println("Server: Hello! "+name);return "Hello: "+name;}}

以上两步注意点以@WebService注解SEI及SEI实现类,以@WebMethod注解SEI方法;

      3.发布服务:
package com.devins.ws.server.publish;import javax.xml.ws.Endpoint;import com.devins.ws.server.service.impl.SayHelloImpl;public class ServicePublishTest {public static void main(String[] args) {String address = "http://132.122.239.74:8089/ws/sayhello";//利用EndPoint类来进行发布Endpoint.publish(address, new SayHelloImpl());System.out.println("WebService服务发布成功!");}}

server工程结构如下:


完成以上编码,运行发布服务的main方法,此时即可在浏览器中输入 
http://132.122.239.74:8089/ws/sayhello?wsdls 查看wsdl信息,表示服务发布成功。如下图:
<img src="http://img.blog.csdn.net/20150506084914075?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9zb25yaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


        4.创建客户端工程,通过jdk工具wsimport.exe来生成客户端调用代码,通过命令行进入到客户端工程的src目录,命令如下:

        wsimport  -keep  url     这里的url即服务器端发布的wsdl地址,执行如下:


执行完成后刷新客户端工程,工程生成如下代码:



      5.编写客户端调用代码:

package com.devins.ws.client;import com.devins.ws.server.service.impl.SayHelloImpl;import com.devins.ws.server.service.impl.SayHelloImplService;/* * 通过远端wsdl地址生成客户端代码的方式 */public class ClientTest {public static void main(String[] args) {SayHelloImplService factory = new SayHelloImplService();SayHelloImpl sayHelloImpl = factory.getSayHelloImplPort();String result = sayHelloImpl.sayHello("devins");System.out.println("client :"+result);}}
至此,通过JDK实现webservice的开发已经完成,右键运行客户端代码结果如下:

客户端控制台:


服务器端控制台:



通过以上方式实现客户端,我们会发现对于开发编码实现阶段,不方便查看soap消息,即请求消息与响应消息,Eclipse已经帮我们开发人员想到了,Eclipse 提供了监控TCP/IP的工具,进行以下配置步骤:
1.生成本地wsdl文档,可以浏览器运行 http://132.122.239.74:8089/ws/sayhello?wsdls 将相关内容保存成wsdl文件,如service.wsdl;

2.修改本地service.wsdl的发布端口为8080,可以根据需要设置其它的空闲端口也可以;

<service name="SayHelloImplService"><port name="SayHelloImplPort" binding="tns:SayHelloImplPortBinding"><soap:address location="http://132.122.239.74:<span style="color:#ff0000;">8080</span>/ws/sayhello" /></port></service>


3.根据本地wsdl文档生成客户端代码,这里建了另一个客户端工程Webservice-jdk-client2,命令行进入src目录方法如下图:


其它代码与第一个client工程相同。

4.配置Eclipse TCP/IP监听,配置如下图:



完成以上几步后即可右键运行客户端调用代码,运行后在控制台会同时出现以下TCP/IP监听视窗,如下图:



从上图中可以较方便的看到请求消息与响应消息,便于开发过程中的查看与调试。至此,使用JDK开发webservice的过程已经完成。后续还将逐步深入的介绍有关webservice的知识。



1 0