快速入门
首先,我们来尝试一下调用别人写好的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使用步骤如下:
- 创建 HttpClient 的实例
- 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址
- 配置要传输的参数,和消息头信息
- 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
- 通过response读取字符串
- 释放连接。无论执行方法是否成功,都必须释放连接
//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 : 指定输出的包名
这里写图片描述
首先我们先把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源码来进行测试
这里写图片描述