首先咱们来谈一下为何须要学习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,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用.
咱们能够调用互联网上查询天气信息Web服务,而后将它嵌入到咱们的程序(C/S或B/S程序)当中来,当用户从咱们的网点看到天气信息时,他会认为咱们为他提供了不少的信息服务,但其实咱们什么也没有作,只是简单调用了一下服务器上的一段代码而已。
学习WebService能够将你的服务(一段代码)发布到互联网上让别人去调用,也能够调用别人机器上发布的WebService,就像使用本身的代码同样.。
咱们在学习Java基础网络编程章节已经知道了Scoket这么一个链接了。
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(); } }
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浏览器中对其进行访问.咱们同样可以获取获得数据!
ISO的七层模型 : 物理层、数据链路层、网络层、传输层、表示层、会话层、应用层
问题:
首先,咱们来尝试一下调用别人写好的webService,来体验一把:咱们访问http://www.webxml.com.cn/zh_cn/index.aspx
进入到里边
当咱们输入一个号码,它就可以查询出咱们的手机位置信息:
咱们如今要作的就是将这个服务让咱们本身写的应用程序中也能够调用,那怎么作呢???
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(); } }
为何要使用HttpClient工具:
HttpClient使用步骤以下:
//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); }
上面咱们使用的是GET方式或者使用Http-Client框架来调用webservice的服务,其实这两种方式也有弊端
若是咱们能够把整个对象传递进去,返回的结果更加友好的话,就好像咱们日常调用Java类同样使用webservice就好咯!
Java也提供了相似的方法,把webservice服务搞成是Java类让咱们本身调用,既然是Java类的话,那么咱们使用起来就很是方便了!
把webservice服务搞成是Java类让咱们本身调用其实就是Java帮咱们生成本地代理,再经过本地代理来访问webservice
wsimport是Java自带的一个命令,咱们想要使用该命令,就必须配置环境变量,而且jdk的版本最好是1.7或以上
值得注意的是:ide带的JDK版本要和wsimport生成本地的版本一致,否则就用不了!!!
首先咱们先把cmd的路径退到桌面上:
而后对WSDL文件生成本地代理
该本地代理其实就是一堆的字节码文件
将获得的字节码文件打包成jar,那么咱们只要在项目中导入jar包,就能够调用了!
语法
jar cvf test.jar【jar包的名称】 打包目录
原本我是想将本地代理的class文件生成jar包,而后导入到idea环境下,那么直接调用就好了。但是idea总是报出找不到对应的类,找了半天也找不到,很烦呀!!!!我考虑了如下的几种状况
最后我仍是没有找到办法,若是知道是什么缘由的,麻烦在评论中告诉我吧….所以此次的测试import,我就不只仅生成class字节码文件,还生成了.java文件。我就直接使用java文件来测试了。
在zhongfucheng目录下生成本地代理,把java源码也带上
因而我就把java源码复制到个人项目中,用java源码来进行测试
有的同窗可能会疑问,为啥wsimport能那么厉害,将http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
这么一个url生成本地代理,其实咱们看了WSDL文件就知道了。
值得注意的是,本地代理仅仅是有其方法,类,并不能解析出具体的实现的。具体的操做其实仍是webservice去完成的。代理这么一个概念就更加清晰了。