WebService的简单介绍与使用

  WebService是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

  Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
  说白了,WebService就是两个系统之间的远程调用技术,WebService之间的调用可以实现跨语言调用,因为调用使用的是HTTP协议,传输的数据格式是XML。

  WebService只采用HTTP POST方式传输数据,不使用GET方式。

 
 

  WebService的特点::

  (1)互操作性

  任何的WebService之间都可以进行交互。由于WebService与客户端之间一般使用SOAP协议传输XML数据,而因为SOAP这个所有主要供应商都支持的新标准协议,所以避免了在CORBA、DCOM和其他协议之间需要转换的麻烦,并且可以使用任何程序语言来编写WebService,节约了编程者的开发成本。 

  (2)普遍性

  WebService通过HTTP POST方式接受客户的请求,利用HTTP和XML进行通信,因此,任何支持这些技术的设备都可以拥有和访问Web Service。 

    (3)易于使用 

    Web Service蕴涵的基本概念易于理解,开发不受程序语言和平台的限制,它本身就是为了跨平台或跨语言而设计的。

  (4)行业支持

   所有主要的供应商都支持SOAP和WebService技术。 

  

  说WebService之前先介绍一下两个很重要的概念SOAP和WSDL。

  首先是SOAP(Simple Object Access Protocol)简单对象访问协议

    简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

    其实就是在HTTP协议是传输XML文件,就变成了SOAP协议。

     (1)SOAP作为一个基于XML语言的协议用于在网上传输数据。

     (2)SOAP是基于HTTP的,SOAP = 在HTTP的基础上+XML数据。

     (3)SOAP的组成如下:

    Envelope – 必须的部分。以XML的根元素出现。

    Headers – 可选的。

    Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

  soap示例

<!-- 请求 -->
POST /WebServices/MobileCodeWS.asmx HTTP/1.1 Host: ws.webxml.com.cn Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://WebXml.com.cn/getMobileCodeInfo"
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getMobileCodeInfo xmlns="http://WebXml.com.cn/"> <mobileCode>string</mobileCode> <userID>string</userID> </getMobileCodeInfo> </soap:Body> </soap:Envelope>
<!-- 响应 -->
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/"> <getMobileCodeInfoResult>string</getMobileCodeInfoResult> </getMobileCodeInfoResponse> </soap:Body> </soap:Envelope>

  

  然后是WSDL (WebService Description Language)Web服务描述语言

  它包含一系列描述某个web service的定,其实就是一个xml文档,用于描述当前服务的一些信息(服务名称、服务的发布地址、服务提供的方法、方法的参数类型、方法的返回值类型等)

  WSDL示例

<!--
 Published by JAX-WS RI (http://jax-ws.java.net). RI\'s version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. 
-->
<!--
 Generated by JAX-WS RI (http://jax-ws.java.net). RI\'s version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. 
-->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webxml.com.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://webxml.com.cn/" name="TestWebServiceService">
<types>
<xsd:schema>
<xsd:import namespace="http://webxml.com.cn/" schemaLocation="http://localhost:8080/first?xsd=1"/>
</xsd:schema>
</types>
<message name="firstWebService">
<part name="parameters" element="tns:firstWebService"/>
</message>
<message name="firstWebServiceResponse">
<part name="parameters" element="tns:firstWebServiceResponse"/>
</message>
<portType name="TestWebService">
<operation name="firstWebService">
<input wsam:Action="http://webxml.com.cn/TestWebService/firstWebServiceRequest" message="tns:firstWebService"/>
<output wsam:Action="http://webxml.com.cn/TestWebService/firstWebServiceResponse" message="tns:firstWebServiceResponse"/>
</operation>
</portType>
<binding name="TestWebServicePortBinding" type="tns:TestWebService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="firstWebService">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="TestWebServiceService">
<port name="TestWebServicePort" binding="tns:TestWebServicePortBinding">
<soap:address location="http://localhost:8080/first"/>
</port>
</service>
</definitions>

  

  WebService的简单使用

  服务端的发布:基于JDK1.8发布一个WebService服务

  第一步:创建一个Java项目

  第二步:创建一个类,加入Webservice注解

  @WebService是jdk提供的一个注解,它位于javax.jws.*这个包中。 

  第三步:创建一个方法

  第四步:在main方法中调用jdk提供的发布服务的方法

    通过EndPoint(端点服务)发布一个webService。

    Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。

    static Endpoint.publish(String address, Object implementor)   在给定地址处针对指定的实现者对象创建并发布端点。

    stop方法用于停止服务。

    EndPoint发布完成服务以后,将会独立的线程运行。所以,publish之后的代码,可以正常执行。

    注意事项:

      (1)给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。

      (2)不支持静态方法,final方法。-

      (3)如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。

      (4)如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService
public class TestWebService {
    public static void main(String[] args) {
        String address = "http://localhost:8080/first";
        Object implementor = new TestWebService();
        Endpoint.publish(address, implementor);
    }
    
    public String firstWebService(String name){
        System.out.println("一个简单的WebService服务");
        return "Hello "+name;
    }
}

  第五步:访问服务的wsdl文档(服务的发布地址+?wsdl)http://localhost:8080/first?wsdl

  出来的页面就是刚刚上面的wsdl示例

  目前不是访问webService,只是获取一个用于描述WebService的说明文件,即:wsdl文件.

  wsdl是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用

 

  而基于JDK发布的WebService服务与普通的不太一样,方法的参数与返回值需要访问http://localhost:8080/first?xsd=1来查看

<!--
 Published by JAX-WS RI (http://jax-ws.java.net). RI\'s version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. 
-->
<xs:schema xmlns:tns="http://webxml.com.cn/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://webxml.com.cn/">
<xs:element name="firstWebService" type="tns:firstWebService"/>
<xs:element name="firstWebServiceResponse" type="tns:firstWebServiceResponse"/>
<xs:complexType name="firstWebService">
<xs:sequence>
<xs:element name="arg0" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="firstWebServiceResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

 

  客户端调用

  首先,使用JDK中的wsimport命令,他的作用是解析wsdl文件,生成客户端本地代码。

  wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要.

  wsimport.exe位于JAVA_HOME\bin目录下.

  常用参数为:

    -d<目录>  – 将生成.class文件。默认参数。

    -s<目录> – 将生成.java文件。

    -p<生成的新包名> -将生成的类,放于指定的包下。

    (wsdlurl) – http://server:port/service?wsdl,必须的参数。

    示例:

    在cmd中执行这条命令

   wsimport -s . http://localhost:8080/first?wsdl

    注意:(1)-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。

         (2)如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。

              (3).class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行。

     执行完这句指令后,在相应的文件夹中会生成以下文件

  接下来,把这些文件中的Java文件拷贝到工程的src目录下

 

  写一个测试类

package cn.com.webxml;

/**
 * 1、使用wsimport命令解析wsdl文件生成本地代码
 * 2、通过本地代码创建一个代理对象
 * 3、通过代理对象实现远程调用
 */
public class TestApp {
    public static void main(String[] args) {
        TestWebServiceService ts = new TestWebServiceService();
        //创建客户端代理对象,用于远程调用
        TestWebService proxy = ts.getTestWebServicePort();
        String result = proxy.firstWebService("小明");
        System.out.println(result);

    }
}

  执行后,发现产生如下结果,客户端控制台与服务端控制台打印

                                               

          

 

  到现在,一个简单的WebService程序就完成了。

  如果对WebService有了一定了解,可以了解一下CXF,因为我们很少直接用WebService进行开发。

  链接:http://www.cnblogs.com/xiaobai1226/p/7583758.html

 

 

 

 

  

版权声明:本文为xiaobai1226原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaobai1226/p/7543965.html