webservice第一篇【介绍、Scoket、http调用、wsimport调用】

WebService介绍

首先咱们来谈一下为何须要学习webService这样的一个技术吧….java

问题一

若是咱们的网站须要提供一个天气预报这样一个需求的话,那咱们该怎么作?????web

天气预报这么一个功能并非简单的JS组件就可以实现的,它的数据是依赖数据库分析出来的,甚至须要卫星探测..咱们我的建站是不可能搞这么一个数据库的吧。数据库

那么既然咱们本身干不了,咱们能够去找别人吗???咱们从搜索引擎搜索,能够发现不少提供天气预报的网站,可是它返回的是一个网页,而咱们仅仅须要的是对应的数据编程

咱们可能就在想,咱们能不能仅仅只要它返回的数据,而并非通过加工处理后返回的网页呢??浏览器

因而乎,webService就诞生了,webservice就是一个部署在Web服务器上的,它向外界暴露出一个可以经过Web进行调用的API。也就是说:当咱们想要获取天气预报的信息,咱们能够调用别人写好的service服务,咱们调用就可以获得结果了缓存

问题二

但是咱们写网站主流的就有好几个平台:Java、.net、PHP等等,那么部署在Web服务器上的服务器也就是webserice怎么可以就让咱们不一样的平台都可以调用呢??服务器

咱们知道java、.net这样的平台他们语言的基本数据类型、复杂数据类型就可能不同,那么怎么可以实现调用的呢???markdown

来引用一段话网络

你们在写应用程序查询数据库时,并无考虑过为何能够将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该作的,其实否则,这是数据库经过TCP/IP协议与另外一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库自己并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。框架

不管是Java、.net、PHP等等的平台,只要是网页开发都是能够经过http协议来进行通讯的,而且返回的数据要是通用的话,那么咱们早就学过这样的一种技术【XML】

因此webservice实际上就是http+XML

这里写图片描述

对webservice的理解

WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用.

咱们能够调用互联网上查询天气信息Web服务,而后将它嵌入到咱们的程序(C/S或B/S程序)当中来,当用户从咱们的网点看到天气信息时,他会认为咱们为他提供了不少的信息服务,但其实咱们什么也没有作,只是简单调用了一下服务器上的一段代码而已。

学习WebService能够将你的服务(一段代码)发布到互联网上让别人去调用,也能够调用别人机器上发布的WebService,就像使用本身的代码同样.。


回顾Socket

咱们在学习Java基础网络编程章节已经知道了Scoket这么一个链接了。

Socket服务端

public class SocketSer {

    public static void main(String[] args) throws Exception {

        ServerSocket ss = new ServerSocket(6666);
        boolean flag = true;
        while (flag) {
            //接收客户端的请求
            System.out.println("监听客户端的数据:");
            Socket sc = ss.accept();
            InputStream is = sc.getInputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            len = is.read(buffer);
            String getData = new String(buffer, 0, len);
            System.out.println("从客户端获取的数据:" + getData);
            //业务处理 大小写转化
            String outPutData = getData.toUpperCase();

            //向客户端写数据
            OutputStream os = sc.getOutputStream();
            os.write(outPutData.getBytes("UTF-8"));

            //释放资源
            os.close();
            is.close();
            sc.close();
        }
        ss.close();
    }

}

Socket客服端

public class SocketClient {

    public static void main(String[] args) throws Exception {
        //获取用户输入的数据
        Scanner input = new Scanner(System.in);
        System.out.println("请输入数据:");
        String inputData = input.nextLine();

        //开启一个Socket端口
        Socket sc = new Socket("127.0.0.1", 6666);
        OutputStream os = sc.getOutputStream();
        os.write(inputData.getBytes());

        //获取服务端回传的数据
        InputStream is = sc.getInputStream();
        byte[] buffer = new byte[1024];
        int len = -1;
        len = is.read(buffer);
        String getData = new String(buffer, 0, len);
        System.out.println("从服务端获取的数据:" + getData);
        //是否流
        is.close();
        os.close();
        sc.close();
    }

}

当咱们从客户端输入数据之后,那么服务端就会把数据转成是大写

这里写图片描述

这里写图片描述

其实HTTP协议就是基于Socket对其进行封装,咱们也能够在IE浏览器中对其进行访问.咱们同样可以获取获得数据!

这里写图片描述

这里写图片描述


Scoket与HTTP简述

这里写图片描述

ISO的七层模型 : 物理层、数据链路层、网络层、传输层、表示层、会话层、应用层

  • Socket访问 : Socket属于传输层,它是对Tcp/ip协议的实现,包含TCP/UDP,它是全部通讯协议的基础,Http协议须要Socket支持,以Socket做为基础
  • Socket通讯特色:
    - 开启端口,该通讯是 长链接的通讯 ,很容易被防火墙拦截,能够经过心跳机制来实现 ,开发难度片断
    - 传输的数据通常是字符串 ,可读性不强
    - socket端口不便于推广
    - 性能相对于其余的通讯协议是最优的
  • Http协议访问 :属于应用层的协议,对Socket进行了封装
    - 跨平台
    - 传数据不够友好
    - 对第三方应用提供的服务,但愿对外暴露服务接口

问题:

  • 数据封装不够友好 :能够用xml封装数据
  • 但愿给第三方应用提供web方式的服务 (http + xml) = web Service

webService相关术语

  • 名词1:XML. Extensible Markup Language -扩展性标记语言
    • XML,用于传输格式化的数据,是Web服务的基础。
    • namespace-命名空间。
    • xmlns=“http://itcast.cn” 使用默认命名空间。
    • xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。
  • 名词2:WSDL – WebService Description Language – Web服务描述语言。
    • 经过XML形式说明服务在什么地方-地址。
    • 经过XML形式说明服务提供什么样的方法 – 如何调用。
  • 名词3:SOAP-Simple Object Access Protocol(简单对象访问协议)
    • SOAP做为一个基于XML语言的协议用于有网上传输数据。
    • SOAP = 在HTTP的基础上+XML数据。
    • SOAP是基于HTTP的。
    • SOAP的组成以下:
      • Envelope – 必须的部分。以XML的根元素出现。
      • Headers – 可选的。
      • Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

快速入门

首先,咱们来尝试一下调用别人写好的webService,来体验一把:咱们访问http://www.webxml.com.cn/zh_cn/index.aspx

这里写图片描述

进入到里边

这里写图片描述

当咱们输入一个号码,它就可以查询出咱们的手机位置信息:

咱们如今要作的就是将这个服务让咱们本身写的应用程序中也能够调用,那怎么作呢???

http-get方式访问webservice

这里写图片描述

public void get(String mobileCode ,String userID ) throws Exception{
        URL url=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode="+mobileCode+
                "&userID="+userID);
        HttpURLConnection conn=(HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ //结果码=200
            InputStream is=conn.getInputStream();
            //内存流 , 
            ByteArrayOutputStream boas=new ByteArrayOutputStream();
            byte[] buffer=new byte[1024];
            int len=-1;
            while((len=is.read(buffer))!=-1){
                boas.write(buffer, 0, len);
            }
            System.out.println("GET请求获取的数据:"+boas.toString());
            boas.close();
            is.close();
        }
    }

这里写图片描述


Http-Client 框架POST请求

为何要使用HttpClient工具:

  • 原生态的Socket基于传输层,如今咱们要访问的WebService是基于HTTP的属于应用层,因此咱们的Socket通讯要借助HttpClient发HTTP请求,这样格式才能匹配

HttpClient使用步骤以下:

  1. 建立 HttpClient 的实例
  2. 建立某种链接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待链接的地址
  3. 配置要传输的参数,和消息头信息
  4. 调用第一步中建立好的实例的 execute 方法来执行第二步中建立好的 method 实例
  5. 经过response读取字符串
  6. 释放链接。不管执行方法是否成功,都必须释放链接
//2.Post请求 :经过Http-Client 框架来模拟实现 Http请求
    public void post(String mobileCode ,String userID) throws Exception{

/**HttpClient访问网络的实现步骤: * 1. 准备一个请求客户端:浏览器 * 2. 准备请求方式: GET 、POST * 3. 设置要传递的参数 * 4.执行请求 * 5. 获取结果 */
        HttpClient client=new HttpClient();
        PostMethod postMethod=new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo");
        //3.设置请求参数
        postMethod.setParameter("mobileCode", mobileCode);
        postMethod.setParameter("userID", userID);
        //4.执行请求 ,结果码
        int code=client.executeMethod(postMethod);
        //5. 获取结果
        String result=postMethod.getResponseBodyAsString();
        System.out.println("Post请求的结果:"+result);
    }


    //2.Post请求 :经过Http-Client 框架来模拟实现 Http请求
    public void soap() throws Exception{

        HttpClient client=new HttpClient();
        PostMethod postMethod=new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
        //3.设置请求参数
          postMethod.setRequestBody(new FileInputStream("c:/soap.xml"));
          //修改请求的头部
          postMethod.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
        //4.执行请求 ,结果码
        int code=client.executeMethod(postMethod);
        System.out.println("结果码:"+code);
        //5. 获取结果
        String result=postMethod.getResponseBodyAsString();
        System.out.println("Post请求的结果:"+result);
    }

wsimport

上面咱们使用的是GET方式或者使用Http-Client框架来调用webservice的服务,其实这两种方式也有弊端

  • 传递参数麻烦【get方式都写在请求地址上、post方式要一个一个封装】
  • 解析结果麻烦【根据返回的XML来解析字符串】

若是咱们能够把整个对象传递进去,返回的结果更加友好的话,就好像咱们日常调用Java类同样使用webservice就好咯

Java也提供了相似的方法,把webservice服务搞成是Java类让咱们本身调用,既然是Java类的话,那么咱们使用起来就很是方便了!

把webservice服务搞成是Java类让咱们本身调用其实就是Java帮咱们生成本地代理,再经过本地代理来访问webservice

快速入门

wsimport是Java自带的一个命令,咱们想要使用该命令,就必须配置环境变量,而且jdk的版本最好是1.7或以上

值得注意的是:ide带的JDK版本要和wsimport生成本地的版本一致,否则就用不了!!!

  • wsimport使用:

    • wsimport命令后面跟着的是WSDL的url路径 语法 wsimport [opations]
    • wsdl_uri:wsdl 的统一资源标识符
    • d :指定要输出的文件的位置
    • s :表示要解析java的源码 ,默认解析出的是class字节码
    • p : 指定输出的包名

这里写图片描述

首先咱们先把cmd的路径退到桌面上:

这里写图片描述

而后对WSDL文件生成本地代理

这里写图片描述

这里写图片描述

该本地代理其实就是一堆的字节码文件

这里写图片描述

将获得的字节码文件打包成jar,那么咱们只要在项目中导入jar包,就能够调用了!

语法

jar cvf  test.jar【jar包的名称】 打包目录

这里写图片描述

原本我是想将本地代理的class文件生成jar包,而后导入到idea环境下,那么直接调用就好了。但是idea总是报出找不到对应的类,找了半天也找不到,很烦呀!!!!我考虑了如下的几种状况

  • * 生成的class文件的JVM和idea下的JVM环境不匹配【后来切换了也不行】*
  • idea缓存缘由,把idea全部缓存去掉也不行
  • 生成的本地代理包名cn不行【???idea就是对cn这个包名报错,后来我改为自定义的包名也不行】

最后我仍是没有找到办法,若是知道是什么缘由的,麻烦在评论中告诉我吧….所以此次的测试import,我就不只仅生成class字节码文件,还生成了.java文件。我就直接使用java文件来测试了。

在zhongfucheng目录下生成本地代理,把java源码也带上

这里写图片描述

因而我就把java源码复制到个人项目中,用java源码来进行测试

这里写图片描述


解析WSDL

有的同窗可能会疑问,为啥wsimport能那么厉害,将http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL这么一个url生成本地代理,其实咱们看了WSDL文件就知道了。

这里写图片描述

值得注意的是,本地代理仅仅是有其方法,类,并不能解析出具体的实现的。具体的操做其实仍是webservice去完成的。代理这么一个概念就更加清晰了。

相关文章
相关标签/搜索