webservice学习心得

    最近学习了webservice,在没有学习webservice之前我对它做了很多猜测,认为它相比于http服务(例如springmvc)更加的复杂。因为以前了解过一点webservice,其中提到了soap,wsdl等专业名词,听起来就让人头大。但是在学习了之后感觉其实just so so。哈哈哈,膨胀了。其实webservice也没有那么简单,只是我学的只是最基础的,并且使用了框架(jax)。我是通过黑马程序员的网上视频学习的。这里要着重感谢黑马程序员。感谢他们的奉献和分享精神,我的很多技术都是通过黑马程序员入门的。

    视频链接:黑马webservice视频

    本篇博客主要是为了记录我在学习中对webservice的理解,你也可以把它当做一个简单的对webserivce的介绍或者入门。

webservice理解(如果直接想看干料请跳到CXF实现webservice)

    在学习一门技术之前通常我们要知道这个技术是用来干什么的,并了解它大致运行的原理(并不需要很详细,毕竟我们大部分人只是为了使用这个技术,了解大致原理是为了我们学习的更加高效)。webserivce首先是一个web服务,什么是web服务呢?在写这篇博客时,我百度了一下,然而并没有让我很满意的解释,所以我不得不自己编(哈哈,就是编)。在我的理解中web服务就是web上的服务(又水了好几个字)。

    通常我们把web理解为网络(我是这么理解的,百度翻译web是万维网),Web服务就是发布在网络上的服务。那么什么是服务呢,类比于小卖部,我们跟老板说,“来一包辣条”,老板就会给我们拿一包辣条,我们称老板给我们提供了服务。Web服务就是我们跟浏览器(或者其他软件)说,给我今天的天气信息,然后浏览器就乖乖地给我们今天天气的信息了。当然作为神秘的程序员我们不能说这么接地气的指令,我们要用些高大上的指令将我们和普通凡人区别开来,我们会跟浏览器说“http://ws.webxml.com.cn/WebServices/WeatherWS.asmx”。当然还要带上必要的数据。我们就能得到天气服务。你可能会想,我靠!怎么这么熟悉,这跟我浏览网页有什么区别,我在浏览器中输入http://www.baidu.com,就能看到百度首页。对了,这也是百度提供的Web服务。但是他可能用的不是webservice服务,极有可能是http服务。

webservice专业名词通俗解释

    看完上面相信你对Web服务有了简单了解,我们假定你有一定的的j2ee基础(jsp,servlet)。webservice服务是怎么运行的呢。我们作为服务提供者,我们首先肯定要有我们的 "门面房" ,我们通常称之为url(服务地址),有了这个门面房客户就能找到我们了,客户找到我们的店面了,那么他们怎么知道我们有哪些服务呢?我们会把自己有的服务像餐厅菜单一样整合在一起,让客户能知道我们有哪些服务,我们把我们的菜单称为WDLS(webservice的描述语言)。客户知道我们有哪些服务之后就需要跟我们说他要什么服务,客户怎么跟我们具体描述它需要的服务呢,所以webservice就定义了一个规范叫SOAP(简易对象访问协议),客户给我们发一个SOAP我们就知道它要的是什么服务了。

    上面是从服务提供者的角度看待webservice的,那么从服务消费者,也就是通俗上的客户爸爸的角度来说,我们怎么使用webservice服务呢。首先我们要找到他们的店面(url域名),查看他们的服务菜单(WDLS,给个链接例子http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl),跟他们说我们需要的服务(发送SOAP)。这样就可以了,跟把大象放进冰箱一样简单。

实现发布webservice服务,我们需要怎么做

    现在试想一下,我们要怎么样才能发布一个webservice的服务呢?我在这里使用java来分析实现方式,首先肯定用的是servlet,一个servlet对应一个url。哇,这么看,一个servlet就能提供一个webservice服务,我们在servelt中的doXxx()方法中可以获取request和response对象,从request对象中我们可以获取到客户给我们发的服务要求(SOAP),我们可以解析这个SOAP(SOAP就是一个xml),我们忽略底层细节(其实是我不知道底层细节,哈哈),我们就知道客户端想要什么服务,我们只要调用对应的方法,最后将结果传给客户就好了。客户端拿到这个结果也需要解析xml,然后拿到自己想要的信息。

    了解了上面的开发思路之后,是不是想着马上动手实现webservice了呢,先别着急,我们分析一下上面的开发流程。首先我们要手动解析SOAP,从中获取客户端需要的服务,而SOAP格式固定,那么有没有那个好心人能帮我们写好方法,我们给它SOAP,他就解析好给我们呢;还有就是我们完成服务后,我们需要将结果包装成规定格式才能发送给客户端,有没有那个好心人能帮我们封装一下呢。还有就是servelt中代码格式基本固定,就是将大象放进冰箱的三步,获取SOAP解析客户需要的服务,执行服务方法,将方法返回数据封装返回。有没有那个好心人将这个架子搭起来,让我只要关注服务的实现方法上呢?那些菜单(WSDL)的发布,SOAP的解析等都帮我们实现好呢?。当然有,而且有很多,我学习的时apache 的 cxf框架。使用cxf框架开发webservice之后,我感觉腰不酸了,脊椎不疼了,妈妈再也不用担心我的学习了。cxf帮我们解析了SOAP和实现了servelt(cxfservelt),我们只需要关注我们的服务实现就可以了。

    那么我们如果是服务调用者呢?我们需要怎么实现服务调用?我们首先需要从服务提供者那里获取菜单(WSDL,WSDL也是一个xml),解析xml我们知道了有哪些服务,我们再根据WSDL生成SOAP,将我们的服务要求使用httpClient发送给服务提供者。好了,知道这些开发思路之后就可以去实现了。当然不可能,就像上面一样,我们分析一下这个实现,有好多模板化的东西,作为一个“有经验”的开发人员,我们就知道肯定有框架帮我们实现。有没有框架能根据WSDL给我们生成服务端的类,我们调用这些类的方法就可以发送服务请求,然后得到结果。有没有一个框架能帮我们封装一下,能把我们调用的类的方法以及参数生成SOAP发送给服务端,然后将服务端发回来的信息解析一下,作为方法返回值给我们,我们就像调用本地方法一样调用webservice服务呢。当然还是apache 的 cxf框架。

CXF实现webservice

    说出来你可能不信,说了这么多,终于来到了正文,可谓是千呼万唤始出来啊。这里只是简单的总结,如果想要具体学习还是看官网或者上面的视频吧。

     环境;maven+idea+java+jetty

    服务端

      我们使用的是cxf的框架,所以我们当然需要导入cxf的jar包,我是使用maven工程,所以直接贴上pom.xml文件


    
      junit
      junit
      4.11
      test
    
    
      org.apache.cxf
      cxf-rt-frontend-jaxws
      LATEST
    
    
      org.apache.cxf
      cxf-rt-transports-http
      LATEST
    
    
    
      org.apache.cxf
      cxf-rt-transports-http-jetty
      LATEST
    

  服务接口(根据我的理解,cxf根据这个接口生成WSDL)

@WebService
public interface HelloWorld {
    public String sayHello(String name);
}

  接口实现

package com.czu.service.impl;

import com.czu.service.HelloWorld;

public class HelloWorldImpl implements HelloWorld {
    @Override
    public String sayHello(String name) {
        return name + ",hello world";
    }
}

  发布服务

public class server {
    public static void main(String[] args) {
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();

        factory.setAddress("http://localhost:8080/hello");
        factory.setServiceClass(HelloWorldImpl.class);
        factory.setServiceBean(new HelloWorldImpl());

        factory.create();
        System.out.println("发布成功");
    }
}

客户端

    pom.xml


    
      junit
      junit
      4.11
      test
    
    
      org.apache.cxf
      cxf-rt-frontend-jaxws
      LATEST
    
    
      org.apache.cxf
      cxf-rt-transports-http
      LATEST
    
    
    
      org.apache.cxf
      cxf-rt-transports-http-jetty
      LATEST
    

   获取服务(在获取服务时,我们需要自己获取服务端的接口类,不然我们无法像使用本地方法一样调用webservice方法)

public static void main(String[] args) {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

        factory.setServiceClass(HelloWorld.class);
        factory.setAddress("http://localhost:8080/hello");
        HelloWorld service = (HelloWorld) factory.create();
        String s = service.sayHello("caohao");
        System.out.println(s);
    }

后记

    本文作为萌新的学习心得肯定会有些不足之处,或者错误的地方,所以希望读者能抱着批判的态度审查,如果能够斧正,希望可以留言,我会即使回复和修改。或者可以联系我的qq:291225153。希望读者老爷们添加我的qq跟我交流。

你可能感兴趣的:(webservice学习心得)