WebService就是这么简单(二)

简介: 首先我们来谈一下为什么需要学习webService这样的一个技术吧….

快速入门

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

38.jpg这里写图片描述

进入到里边

39.jpg

这里写图片描述

当我们输入一个号码,它就能够查询出我们的手机位置信息:

40.jpg


我们现在要做的就是将这个服务让我们自己写的应用程序中也可以调用,那怎么做呢???

http-get方式访问webservice

41.jpg

这里写图片描述

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();
        }
    }

42.png

这里写图片描述



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_uri:wsdl 的统一资源标识符
  • d  :指定要输出的文件的位置
  • s  :表示要解析java的源码 ,默认解析出的是class字节码
  • p  : 指定输出的包名

43.jpg这里写图片描述

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

44.png这里写图片描述

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

45.jpg这里写图片描述这里写图片描述

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

46.png这里写图片描述

将得到的字节码文件打包成jar,那么我们只要在项目中导入jar包,就可以调用了!

语法

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

47.jpg这里写图片描述

本来我是想将本地代理的class文件生成jar包,然后导入到idea环境下,那么直接调用就行了。可是idea老是报出找不到对应的类,找了半天也找不到,很烦呀!!!!我考虑了以下的几种情况

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

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

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

48.jpg这里写图片描述

于是我就把java源码复制到我的项目中,用java源码来进行测试

49.jpg这里写图片描述

目录
相关文章
|
算法 容器
使用令牌桶和漏桶实现请求限流逻辑
使用令牌桶和漏桶实现请求限流逻辑
285 0
|
负载均衡 Java API
【Spring Cloud Gateway 新一代网关】—— 每天一点小知识
【Spring Cloud Gateway 新一代网关】—— 每天一点小知识
487 0
|
10月前
|
消息中间件 Java 中间件
RocketMQ实战—2.RocketMQ集群生产部署
本文主要介绍了大纲什么是消息中间件、消息中间件的技术选型、RocketMQ的架构原理和使用方式、消息中间件路由中心的架构原理、Broker的主从架构原理、高可用的消息中间件生产部署架构、部署一个小规模的RocketMQ集群进行压测、如何对RocketMQ集群进行可视化的监控和管理、进行OS内核参数和JVM参数的调整、如何对小规模RocketMQ集群进行压测、消息中间件集群生产部署规划梳理。
RocketMQ实战—2.RocketMQ集群生产部署
|
6月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
453 16
|
6月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
651 2
|
Windows
DOS 批处理 setlocal命令、endlocal命令详解
DOS 批处理 setlocal命令、endlocal命令详解
565 10
|
XML JavaScript Java
BeanFactory 和 FactoryBean的区别
本文介绍了Spring框架中的`BeanFactory`和`FactoryBean`。`BeanFactory`是Spring的核心接口,用于管理Bean的创建、配置及依赖注入。其实现包括`DefaultListableBeanFactory`和已废弃的`XmlBeanFactory`。`FactoryBean`则用于动态创建Bean实例,支持懒加载及AOP代理创建。文章还通过示例展示了如何实现一个`FactoryBean`,并通过测试验证其功能。最后附上了作者信息及版权声明。
552 0
BeanFactory 和 FactoryBean的区别
|
Kubernetes 网络协议 网络安全
nftables用法介绍
nftables用法介绍
997 2
|
API 开发者
WebApi路由机制详解
在设计路由时,应确保各个路由具有明确的职责分离,并避免冗余和混淆。保持路由的一致性和可预测性可以为API的最终用户带来更好的体验。
256 0
|
JavaScript 前端开发
【Web 前端】jQuery 库中的 $() 是什么?
【5月更文挑战第1天】【Web 前端】jQuery 库中的 $() 是什么?