WebService学习小结
定义:一些站点开放一些服务出来,也可以是你自己开发的service,也就是一些方法,通过URL,指定某一个方法名,发出请求,站点的这个服务(方法),接收请求后,根据传入的参数做一些处理,然后将处理后的结果以XML形式返回给你,你的程序就解析这些XML参数,然后显示出来或做其他操作。
标准的调用过程:
a 服务器首先用一套标准的方法向外界描述它所提供的服务的内容,就属于WSDL
b 客户端需要以一种标准的协议来调用此服务,这属于SOAP.
c 服务提供者将服务内容放在一个公共的网址让大家查询,就属于UDDI.
服务提供者:提供服务及维护注册表以使服务可用;
代理:服务提供者与服务请求者的中介;传统的代理是UDDI注册中心;
服务请求者:发现 Web 服务,然后调用这些服务以创建应用程序;
服务:应用程序,通过服务描述语言进行描述,其描述信息通过代理发布。
SOAP 简单对象存取协议:(simple object access protocol)
定义:当用户通过UDDI找到你的WSDL描述文档后,他通过可以Simple Object Access Protocol (SOAP) 调用你建立的Web服务中的一个或多个操作。 SOAP是XML文档形式的调用商业方法的规范,它可以支持不同的底层接口,象HTTP(S)或者SMTP。 之所以使用XML是因为它的独立于编程语言,良好的可扩展性以及强大的工业支持。之所以使用HTTP是因为几乎所有的网络系统都可以用这种协议来通信,由 于它是一种简单协议,所以可以与任何系统结合,还有一个原因就是它可以利用80端口来穿越过防火墙。 SOAP的强大是因为它简单。SOAP是一种轻量级的,非常容易理解的技术,并且很容易实现。它有工业支持,可以从各主要的电子商务平台供应商那里获得。 从技术角度来看,SOAP详细指明了如何响应不同的请求以及如何对参数编码。一个SOAP封装了可选的头信息和正文,并且通常使用HTTP POST方法来传送到一个HTTP 服务器,当然其他方法也是可以的,例如SMTP。SOAP同时支持消息传送和远程过程调用。以下是一个SOAP请求。
WSDL服务内容的标准化描述:(web service Description Language)
定义:WSDL的全称是web service Description Language,是一种基于XML格式的关于web服务的描述语言。其主要目的在于web service的提供者将自己的web服务的所有相关内容,如所提供的服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全文档,发布给使用者。使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给webservice提供者;web服务在完成服务请求后,将SOAP返回消息传回请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成自己能够理解的内容
UDDI 通用描述、发现与集成服务:(Universal Description, Discovery and Integration )
定义:将web service进行UDDI注册发布,UDDI是一种创建注册表服务的规范,以便大家将自己的web service进行注册发布供使用者查找.然而当服务提供者想将自己的web service向全世界公布,以便外部找到其服务时,那么服务提供者可以将自己的web service注册到相应的UDDI商用注册网站,目前全球有IBM等4家UDDI商用注册网站。因为WSDL文件中已经给定了web service的地址URI,外部可以直接通过WSDL提供的URI进行相应的web service调用。所以UDDI并不是一个必需的web service组件,服务方完全可以不进行UDDI的注册
Axis开发WebService应用小结
1. 开发环境准备
使用软件版本:JDK1.4.2,Weblogic8.1,axis1.4,Eclipse3.2。
JDK、Weblogic、Eclipse3.2准备过程略。
下载axis1.4bin.zip,解压后将lib文件夹中的jar包拷贝至/web-inf/lib目录中,还需要包括activation.jar和mail.jar,分别下载jaf-1.0.2和javamail-1.4.3,axis需要用到这2个jar中的类。
如图:
2. Axis配置
新建Web Project,在web.xml文件中添加如下配置加入axis:
<!-- 添加Axis1.4Servlet --> <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet>
<!-- Axis1.4的发布路径 --> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> |
在/web-inf/目录下添加webServices.xml(可以指定其他目录,该文件为Axis与Spring集成所需要的文件,为spring的bean配置文件,如无spring,可不用配置此项内容),在web.xml文件中加入以下配置将该文件加入到工程中去:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/webServices.xml </param-value> </context-param> |
以上两个配置可以在已经存在的web project中添加,加入以上配置后就可以使用Axis开发WebServices程序了。
3. Axis服务端开发
为WebServices服务编写接口类及其实现类,样例接口类如下:
public interface ISayHello { public String sayHello(String name); } |
public class SayHelloWebService implements ISayHello { public String sayHello(String name){ String rs = " Hello my friend "+name+" ! "; return rs; } } |
在/web-inf/目录下新建server-config.wsdd文件部署WebServices服务:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <service name="SayHello" provider="java:RPC"> <parameter name="wsdlTargetNamespace" value="urn:soap.axisspring"/> <parameter name="className" value="com.tfhz.szds.webservice.test.SayHelloWebService" /> <parameter name="allowedMethods" value="*" /> </service> <transport name="http"> <requestFlow> <handler type="URLMapper"/> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/> <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/> <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/> </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder"/> </responseFlow> </transport> </deployment> |
其中红字的部分是WebServices服务的配置部分,该文档解释如下:
- deployment为文档根节点,必须包括该节点,其中后面的属性不能更改。
- 配置handler节点,使用handler可以实现类似filter的功能,此处用到URLMapper和LocalResponder两个handler
- 每个WebServices服务都需要配置一个Service节点,name属性配置服务名称,provider属性配置服务访问方式,本例中是采用RPC方式;子节点parameter配置service的参数,参数wsdlTargetNamespace配置名称空间,参数className配置实现服务类,参数allowedMethods表示那些方法是WebServices服务可以调用的方法,“*”表示所有方法,可以配置多个方法,用“,”分隔。Service可以通过增加requestFlow节点引用某个handler,在service执行之前会先执行handler的invoke方法,可以通过handler实现一些数据验证或者访问合法性的校验。
- Transport节点定义了服务端的传输方式,本例中定义了两个transport,http和local。
4. Axis客户端开发
public class WebServiceClientTest { public static void main(String[] args) { try { //WebService服务地址 String nameSpaceUrl = "http://localhost:7001/WebContent/services/SayHello"; //开始创建调用对象 Service service = new Service(); Call call = null; call = (Call)service.createCall(); /** * 开始调用SayHello服务 */ //WebServicee服务调用地址 call.setTargetEndpointAddress(new java.net.URL(nameSpaceUrl)); //WebServicee服务调用方法名称 call.setOperationName("sayHello"); //WebServicee服务调用方法参数 call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN); //WebServicee服务调用方法返回值类型 call.setReturnType(XMLType.XSD_STRING);
String reString = (String)call.invoke(new Object[]{"liwei"}); System.out.println(" WebService 服务调用成功 result== "+reString);
} catch (Exception e) { e.printStackTrace(); } } } |
构造如上代码,运行main方法console中打印出:
WebService 服务调用成功 result== Hello my friend liwei !Here is WebService ......
注意:根据以上步骤开发webservice,运行客户端时可能会报以下错误:
以下是从网上找到的解决办法:
WEB-INF/weblogic.xml下增加以下内容:
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
将domain下的startWebLogic.cmd中
set CLASSPATH=%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;%WL_HOME%\server\lib\webservices.jar; %CLASSPATH%
修改为:
set CLASSPATH=%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar; %CLASSPATH%;%WL_HOME%\server\lib\webservices.jar