WebService介绍

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

问题一

如果我们的网站需要提供一个天气预报这样一个需求的话,那我们该怎么做?????

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

那么既然我们自己干不了,我们可以去找别人吗???我们从搜索引擎搜索,可以发现很多提供天气预报的网站,但是它返回的是一个网页,而我们仅仅需要的是对应的数据

我们可能就在想,我们能不能仅仅只要它返回的数据,而并不是经过加工处理后返回的网页呢??

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

问题二

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

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

来引用一段话

大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过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去完成的。代理这么一个概念就更加清晰了。

webservice第一篇【介绍、Scoket、http调用、wsimport调用】的更多相关文章

  1. spring cloud系列教程第一篇-介绍

    spring cloud系列教程第一篇-介绍 前言: 现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了.那么,微服务只是指spring boot吗?当然不是了,微 ...

  2. Java并发包下锁学习第一篇:介绍及学习安排

    Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...

  3. 本文可能是国内第一篇介绍C/4HANA Foundation的中文博客

    SAP C/4HANA从去年发布已经过去了一年多的时间,C/4HANA的从业者,对于这五朵云里包含的产品集,想必都有了一些了解. Jerry注意到,SAP C/4HANA Foundation这个概念 ...

  4. [转] git config命令使用第一篇——介绍,基本操作,增删改查

    平时我们在使用git的时候,很少去关注其配置是如何,而在实际开发中,对git config这个命令的使用也并不是很多,但是配置对一个程序和项目来说都是很重要的,我们今天来看看git的配置以及git c ...

  5. Orchard详解--第一篇 介绍

    Orchard是一个开源的内容管理系统(CMS),它提供了简单的向导式的安装方法,用于快速建站(如WordPress).对于.Net的开发者来说,Orchard有更好的学习价值,所以本系列文章将对Or ...

  6. MySQL学习【第一篇介绍】

    一.数据库mysql的特点 1.首先数据库分为RDBMS(关系型数据库),和NOSQL(非关系型数据库),而我们的mysql则是RDBMS. 2.RDMS和NOSQL特点对比 RDBMS特点: (1) ...

  7. IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...

  8. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...

  9. Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

    <<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识 ...

随机推荐

  1. css3文字与字体样式

    css3使用服务器端字体: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. ExpandableListView实现手风琴效果

    1. 效果示例图 2. 创建方法 (1)第一种方法与ListView等普通控件一样,直接在布局文件中添加ExpandableListView控件即可. (2)第二种方法则是创建一个Activity继承 ...

  3. 我学习go的五个感悟(译)

    我学习go的五个感悟(译) 原文 5 things about programming I learned with Go By MICHAŁ KONARSKI Go在最近一段时间内开始变得十分流行. ...

  4. 使用Visual Studio 2017开发python,并在iis上部署Python Django

    作为宇宙第一IDE,怎么可以不支持python开发呢? 1.Visual Studio Installer 扩展Python开发 开始菜单中打开Visual Studio Installer,点修改. ...

  5. Class类 获取Class对象

    阅读API的Class类得知,Class 没有公共构造方法.Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 获取Class对象的三种方 ...

  6. Java中构造方法跟普通方法的区别?

    构造方法与普通方法的调用时机不同. 首先在一个类中可以定义构造方法与普通方法两种类型的方法,但是这两种方法在调用时有明显的区别. 1.构造方法是在实例化新对象(new)的时候只调用一次 2.普通方法是 ...

  7. [2013-02-22]info入门FAQ

    linux相关的东西,入门最快捷,最通用的方式无非查阅帮助文档. man命令很好理解,就不讲了,这里就提几个info相关的FAQ(也就3点啦) 基本操作,如何入门info 首先,输入info命令 ,进 ...

  8. 纯css实现table表格固定列和表头,中间横向滚动的思路-附案例

    最近做的后台管理系统要处理大量的表格 原项目是采用的for循环加拼接字符串的方式实现;导致js代码一大堆;各种单引号和双引号的嵌套;让人头疼;遂引入vue.js;用v-for做模板渲染;工作量顿时减轻 ...

  9. SQL Server 的锁定和阻塞

    本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...

  10. H5页面中尝试调起APP

    安卓版本5.0以上 IOS版本10.0以上 采用事件触发的方式处理唤醒APP 市面上常见的功能 这种功能现如今应该非常普遍了,淘宝H5,知乎H5等等... 点击后会调起APP或者打开下载页面或者直接进 ...