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.2Weblogic8.1axis1.4Eclipse3.2

JDKWeblogicEclipse3.2准备过程略。

下载axis1.4bin.zip,解压后将lib文件夹中的jar包拷贝至/web-inf/lib目录中,还需要包括activation.jar和mail.jar,分别下载jaf-1.0.2和javamail-1.4.3,axis需要用到这2jar中的类。

如图:

 

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(可以指定其他目录,该文件为AxisSpring集成所需要的文件,为springbean配置文件,如无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服务的配置部分,该文档解释如下:

  1. deployment为文档根节点,必须包括该节点,其中后面的属性不能更改。
  2. 配置handler节点,使用handler可以实现类似filter的功能,此处用到URLMapperLocalResponder两个handler
  3. 每个WebServices服务都需要配置一个Service节点,name属性配置服务名称,provider属性配置服务访问方式,本例中是采用RPC方式;子节点parameter配置service的参数,参数wsdlTargetNamespace配置名称空间,参数className配置实现服务类,参数allowedMethods表示那些方法是WebServices服务可以调用的方法,“*”表示所有方法,可以配置多个方法,用“,”分隔。Service可以通过增加requestFlow节点引用某个handler,在service执行之前会先执行handlerinvoke方法,可以通过handler实现一些数据验证或者访问合法性的校验。
  4. Transport节点定义了服务端的传输方式,本例中定义了两个transporthttplocal

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%jrelib t.jar;%WL_HOME%serverlibwebservices.jar; %CLASSPATH%

修改为:

set CLASSPATH=%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%jrelib t.jar; %CLASSPATH%;%WL_HOME%serverlibwebservices.jar

 

原文地址:https://www.cnblogs.com/hdsbk/p/3543998.html