手把手教你如何玩转WebService(包含项目实践)


时间:早晨 8 : 00 am

小白:起床起床,,,公司又来需求了,你还在睡觉,快点起来~!

我:大惊小怪,又怎么了呢?小白,别一惊一乍的,打扰我的美梦

小白:公司给了个新需求,你还记得,咱们上次做的那个项目吗?

我:记得,怎么了呢?不是都已经上线了吗?

小白:对呀,但是,与我们合作的那个公司,他们想把我们项目里面的物流查询功能,放到他们自己开发的一个系统里面去,说这样方便他们自己进行查询,要不然,老是需要额外登录我们的系统,挺麻烦的,而还要特别的给他们一个账号进行管理。所以,他们的需求就是:让物流查询的功能提供给他们。 

我:意思是他们想跨平台用我们的物流功能呢?

小白:是的,,,快,赶紧想想办法,咱们,总不能又给他们写一套一样的代码嵌入吧,这效率太低了。

我:当然不行了,这样写的话,有很多问题的,而且系统与系统进行了多重嵌入会影响整体的执行。

小白:对呀,所以,那咱们怎么办呢?

我:容我思考思考,针对这样的跨平台问题,其实也挺好解决的,那就是采取WebService的方式,我们将物流查询作为一个WebService,这样只需要他们那边进行相应的规则处理就好了。

小白:WebService??这是一个什么东西呢?有这么神奇,还可以跨平台的吗?

我:当然,这在很多地方其实都用到的,比如天气查询功能,你觉得每个公司都会去写一套这样的代码吗?当然不会。

小白:对哦,要不然这多麻烦,你看像微信公众号里面的那么多服务,都是别人写好的,我们开发都是用一定的规则去解析的。

我:对的,那下面,我来说说,到底什么是WebService和它的功能。

一:WebService简介
(1)简介----百度百科(注意标识的重点)

        Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。 [1] 
       Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

(2)WebService三元素

UDDI:UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。---简单点说,就是一套规则,方便使用;

WSDL:Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。----简单点说,就是使用规则,方便人和机器进行阅读;

SOAP协议:基于Http,基于XML,SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。----简单点说,就是传输协议,方便进行传输;

(3)WebService与Socket的区别(两种通信的方式)

(1) Socket是基于TCP/IP的传输层协议。 
    Webservice是基于HTTP协议传输数据,http是基于tcp的应用层协议。 
    Webservice采用了基于http的soap协议传输数据。
(2)Socket接口通过流传输,不支持面向对象。 
    Webservice 接口支持面向对象,最终webservice将对象进行序列化后通过流传输。 
    Webservice采用soap协议进行通信,不需专门针对数据流的发送和接收进行处理,是一种跨平台的面向对象远程调用技术。
(3)Socket适用于高性能大数据的传输,传输的数据需要手动处理,socket通信的接口协议需要自定义。

二:属于自己的第一个WebService程序
1)服务端代码(Java工程项目即可,而不需要是web项目,因为webservice已经作为了java SE里面自带的内容):

package com.hnu.scw.webservice;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**  
 * <p>Title: MyFirstWebService.java</p>  
 * <p>Description: </p>  
 * <p>Company: 湖南大学</p>  
 * @author scw  
 * @date 2018年5月3日  
 */
@WebService
public class MyFirstWebService {
    /**
     * 定义webservice服务器中的方法
     * @param content
     * @return
     */
    public String testWebService(String content){
        System.out.println("我收到了你发的信息:" + content);
        return "服务器:我转发信息给你";
    }
    
    public static void main(String[] args){
        //定义自己的webservice服务器发布的地址
        String address = "http://localhost:9090/MyFirstWebService"; //这个9090端口随便定义,只要不冲突即可
        //通过该方法进行发布
        Endpoint.publish(address, new MyFirstWebService());
        //打印一句话,表示一下服务器进行了开启
        System.out.println("my webservcie starting");
    }
}
温馨提示:1:必须加@WebService注解或者@WebServiceProvider

2:至少有一个方法是public,并且不可以用static 和 final进行修饰;原因很明显,因为webservice就是提供给别人各自进行使用的,而不是保持同一个,所以不能是static ,而对于final修饰的话就是不可继承,这也是没有意义的。大家可以试试,将方法进行修改,看会不会报错。

(2)解析WebService服务器的内容

操作:在cmd命令行中执行:wsimport -s . http://localhost:9090/MyFirstWebService

结果:这样的话,就会在你执行这句话的目录下面生成对应的服务器的代码(包括.class文件和.java文件)

(3)客户端代码(Java工程项目即可):

步骤:

1:首先是把上面得到的代码中的.java文件(请注意,.class文件就不需要)拷贝到我们新建的一个客户端的java项目中

2:编写我们的测试方法

package com.hnu.scw.webservice;
import org.junit.Test;
/**  
 * <p>Title: MyTestWebService.java</p>  
 * <p>Description: 用于进行测试webservice服务器的客户端代码</p>  
 * <p>Company: 湖南大学</p>  
 * @author scw  
 * @date 2018年5月3日  
 */
public class MyTestWebService {
    @Test
    public void testWebService(){
        //获取webservice服务器对象(这里的类名,其实是从wsdl文件中的servicename标签中进行获取的)
        MyFirstWebServiceService myFirstWebServiceService = new MyFirstWebServiceService();
        //获取到我们自定义的webservice的对象
        MyFirstWebService myFirstWebServicePort = myFirstWebServiceService.getMyFirstWebServicePort();
        //调用service服务器中的方法
        String receivedInfo = myFirstWebServicePort.testWebService("您好,webservice 服务器");
        //打印从服务器的方法中得到的返回值,测试表示收到了服务器返回的内容
        System.out.println("服务器返回的内容是:" + receivedInfo);        
    }    
}
温馨提示:可以通过浏览器输入:http://localhost:端口号/发布的服务器名字?wsdl     -----------来查看定义service的wsdl文档

这时候,我们只需要首先运行服务器端的java项目,然后再运行我们客户端的@Test方法,这样就可以得到从服务器中获取到的消息内容了。

三:与WebService服务器进行交互的方式
(1)普通客户端调用

这个的话就不多说了,因为在我们上面的第一个WebService的代码中,就已经是这样的一种调用方式。

(2)ajax调用

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
    <script type="text/javascript">
        /*
            思路:
            1.创建一个XMLHTTP对象
            2.打开链接open("POST",url)
            3.设置请求头Content-Type
            4.设置回调函数,处理返回值
            5.从返回的XML中解析我们要的内容
        */
        
        var xmlHttpReqquest = new ActiveXObject("Microsoft.XMLHTTP");
        //alert(xmlHttpReqquest);
 
        //发送SOAP请求
        function sendMsg(){
            //获取用户输入的内容
            var name = document.getElementById("name").value;
            var url = "http://localhost:9090/MyFirstWebService";
            //下面的这种格式主要是通过Eclipse下载了一个webservice调式工具,这样就可以看到对应的xml格式内容
            var requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://webservice.scw.hnu.com/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
                            + "<soapenv:Body><q0:testWebService><arg0>"+name+"</arg0></q0:testWebService></soapenv:Body></soapenv:Envelope>";
            xmlHttpReqquest.open("POST", url);
            xmlHttpReqquest.setRequestHeader("Content-Type","text/xml;charset=utf-8");
            xmlHttpReqquest.onreadystatechange = _back;
            xmlHttpReqquest.send(requestBody);
        }
 
        //接收SOAP返回,从返回XML中解析
        function _back(){
            //处理完毕,处理成功
            if(xmlHttpReqquest.readystate==4){        //处理完
                if(xmlHttpReqquest.status==200){    //成功
                    var xml = xmlHttpReqquest.responseXML;
                    //alert(xml);
 
                    //获取return标签的第一个
                    var ele = xml.getElementsByTagName("return")[0];
                    alert(ele.text);
                }else{
                    alert(0);
                }
            }
        }
    
    </script>
</head>
<body>
    <input type="text" id="name" name="name" value=""/>
    <input type="button" name="send" value="send" οnclick="sendMsg();"/>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值