web服务_web服务器 - CSDN
精华内容
参与话题
  •  大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊、书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分。但是不得不承认的是WebService真的是一门新兴和有前途的...

    转自:https://www.cnblogs.com/xdp-gacl/p/4048937.html

    一、序言
      大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊、书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分。但是不得不承认的是WebService真的是一门新兴和有前途的技术,那么WebService到底是什么?何时应该用?
      
      当前的应用程序开发逐步的呈现了两种迥然不同的倾向:一种是基于浏览器的瘦客户端应用程序,一种是基于浏览器的富客户端应用程序(RIA),当然后一种技术相对来说更加的时髦一些(如现在很流行的Html5技术),这里主要讲前者。
      
      基于浏览器的瘦客户端应用程序并不是 因为瘦客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序安装和配置的问题,另一半是因为客户和服务器之间通信的问题。传统的Windows富客户应用程序使用DCOM来与服务器进行通信和调用远程对象。配置好DCOM使其在 一个大型的网络中正常工作将是一个极富挑战性的工作,同时也是许多IT工程师的噩梦。事实上,许多IT工程师宁愿忍受浏览器所带来的功能限制,也不愿在局 域网上去运行一个DCOM。关于客户端与服务器的通信问题,一个完美的解决方法是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都在使用 HTTP协议。同时,当前许多防火墙也配置为只允许HTTP连接。许多商用程序还面临另一个问题,那就是与其他程序的互操作性。如果所有的应用程序都是使 用COM或.NET语言写的,并且都运行在Windows平台上,那就天下太平了。然而,事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM) 的形式存放,并由COBOL语言编写的大型机程序访问。而且,目前还有很多商用程序继续在使用C++、Java、Visual Basic和其他各种各样 的语言编写。现在,除了最简单的程序之外,所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法, 如文件传输和分析,消息队列,还有仅适用于某些情况的的API,如IBM的高级程序到程序交流(APPC)等来完成的。在以前,没有一个应用程序通信标 准,是独立于平台、组建模型和编程语言的。只有通过Web Service,客户端和服务器才能够自由的用HTTP进行通信,不论两个程序的平台和编程语言是什么。

    二、WebService到底是什么
      一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
      
      所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
      
      所谓远程调用,就是一台计算机a上 的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码其实是跑在银 行服务器上。再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程 序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。
      
      其实可以从多个角度来理解 WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过 Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次 看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何 你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
      
      WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台 必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描述 Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远 程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。

    三、WebService平台技术
      XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。

    3.1、XML+XSD
      WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的 返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关 的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。
      
      XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,64位?这 些细节对实现互操作性很重要。XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就 是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所 有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。

    3.2、SOAP
      WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明 HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。
      
      SOAP协议 = HTTP协议 + XML数据格式
      
      SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。打个比 喻:HTTP就是普通公路,XML就是中间的绿色隔离带和两边的防护栏,SOAP就是普通公路经过加隔离带和防护栏改造过的高速公路。
      
    3.3、WSDL
      好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方 法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受 的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。
      
      WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都 能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的 Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。
      
      WSDL 文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。 WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。

    四、WebService开发
      WebService开发可以分为服务器端开发和客户端开发两个方面
      
    4.1、服务端开发
      把公司内部系统的业务方法发布成WebService服务,供远程合作单位和个人调用。(借助一些WebService框架可以很轻松地把自己的业务对象发布成WebService服务,Java方面的典型WebService框架包括:axis,xfire,cxf 等,java ee服务器通常也支持发布WebService服务,例如JBoss。)
      
    4.2、客户端开发
      调用别人发布的WebService服务,大多数人从事的开发都属于这个方面,例如,调用天气预报WebService服务。(使用厂 商的WSDL2Java之类的工具生成静态调用的代理类代码;使用厂商提供的客户端编程API类;使用SUN公司早期标准的jax-rpc开发包;使用 SUN公司最新标准的jax-ws开发包。当然SUN已被ORACLE收购)
      
    4.3、WebService 的工作调用原理
      对客户端而言,我们给这各类WebService客户端API传递wsdl文件的url地址,这些API就会创建出底层的代理类,我调用 这些代理,就可以访问到webservice服务。代理类把客户端的方法调用变成soap格式的请求数据再通过HTTP协议发出去,并把接收到的soap 数据变成返回值返回。对服务端而言,各类WebService框架的本质就是一个大大的Servlet,当远程调用客户端给它通过http协议发送过来 soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成 soap格式的数据,通过http响应消息回给客户端。
      
    五、适用场合
    1、跨防火墙通信
      如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服 务器。在这种情况下,使用DCOM就不是那么简单,通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。传统的做法是,选择用浏览器作为客户 端,写下一大堆ASP页面,把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大,程序很难维护。如果中间层组件换成WebService的话, 就可以从用户界面直接调用中间层组件。从大多数人的经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用WebService这种结构,可以节 省花在用户界面编程上20%的开发时间。

    2、应用程序集成
      企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。应用程序经常 需要从运行在IBM主机上的程序中获取数据;或者把数据发送到主机或UNIX应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常需要集 成起来。通过WebService,可以很容易的集成不同结构的应用程序。

    3、B2B集成
      用WebService集成应用程序,可以使公司内部的商务处理更加自动化。但当交易跨越供应商和客户、突破公司的界限时会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。WebService是B2B集成成功的关键。通过WebService,公司可以把关键的商务应用“暴露”给指定的供应商和客户。例如,把电子下单系统和电子发票系统“暴露”出来,客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购发票。当然,这并不是一个 新的概念,EDI(电子文档交换)早就是这样了。但是,WebService的实现要比EDI简单得多,而且WebService运行在Internet 上,在世界任何地方都可轻易实现,其运行成本就相对较低。不过,WebService并不像EDI那样,是文档交换或B2B集成的完整解决方案。 WebService只是B2B集成的一个关键部分,还需要许多其它的部分才能实现集成。
      
      用WebService来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为WebService,就可以让任何指定 的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B集成上的时间和成本,让许多原本无法承受 EDI的中小企业也能实现B2B集成。

    4、软件和数据重用
      软件重用是一个很大的主题,重用的形式很多,重用的程度有大有小。最基本的形式是源代码模块或者类一级的重用,一种形式是二进制形式的组件重用。采用 WebService应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用,达到业务级重用。

    六、不适用场合
    1、单机应用程序
      目前,企业和个人还使用着很多桌面应用程序。其中一些只需要与本机上的其它程序通信。在这种情况下,最好就不要用WebService,只要用本地的 API就可以了。COM非常适合于在这种情况下工作,因为它既小又快。运行在同一台服务器上的服务器软件也是这样。最好直接用COM或其它本地的API来 进行应用程序间的调用。当然WebService也能用在这些场合,但那样不仅消耗太大,而且不会带来任何好处。

    2、局域网的同构应用程序
      在许多应用中,所有的程序都是用VB或VC开发的,都在Windows平台下使用COM,都运行在同一个局域网上。例如,有两个服务器应用程序需要相互通 信,或者有一个Win32或WinForm的客户程序要连接局域网上另一个服务器的程序。在这些程序里,使用DCOM会比SOAP/HTTP有效得多。与 此相类似,如果一个.NET程序要连接到局域网上的另一个.NET程序,应该使用.NETremoting。有趣的是,在.NETremoting 中,也可以指定使用SOAP/HTTP来进行WebService调用。不过最好还是直接通过TCP进行RPC调用,那样会有效得多。

    展开全文
  • Web服务器工作原理详解(基础篇)

    万次阅读 多人点赞 2018-08-14 17:12:00
    概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的...

    概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的网络应用程序都可以是Web客户端。

    Web服务器和HTTP服务器可以说是同一个东西,当然非得细分的话,HTTP服务器是建立在HTTP协议之上的提供文档浏览的服务器,更多的是提供静态的文件。而Web服务器涵盖了HTTP服务器(这一点可以自行百度百科), Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。
    Web服务器 约等于 HTTP服务器 + 其他服务

    目前所熟知的Web服务器有很多,其最主流的是 Apache, Nginx, IIS
    各大Web服务器的实现细节都不同,是为了某种情形而设计开发的。但是它们的基础工作原理是相同的,这也是本次基础篇所讲解的内容。

    一、Web服务器工作原理图解

    这里写图片描述
    首先我们暂时不考虑HTTP协议的各种请求方式,我们先跟着**(Web服务器工作原理总体描述01)这张图,将一次Web服务的工作流程过一遍,我们假设以浏览器作为客户端
    (1) 用户做出了一个操作,可以是填写网址敲回车,可以是点击链接,可以是点击按键等,接着浏览器获取了该事件。
    (2) 浏览器与对端服务程序建立TCP连接。
    (3) 浏览器将用户的事件
    按照HTTP协议格式**打包成一个数据包,其实质就是在待发送缓冲区中的一段有着HTTP协议格式的字节流。
    (4) 浏览器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到对端服务程序。
    (5) 服务端程序拿到该数据包后,同样以HTTP协议格式解包,然后解析客户端的意图。
    (6) 得知客户端意图后,进行分类处理,或是提供某种文件、或是处理数据。
    (7) 将结果装入缓冲区,或是HTML文件、或是一张图片等。
    (8) 按照HTTP协议格式将(7)中的数据打包
    (9) 服务器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到客户端。
    (10) 浏览器拿到包后,以HTTP协议格式解包,然后解析数据,假设是HTML文件。
    (11) 浏览器将HTML文件展示在页面
    以上为Web服务器工作基本原理。其实不难发现,这仅仅只是一个简单的网络通信。我们应该深信,作为一个服务器,其根本的工作无非有三个

    1. 接收数据 2. 发送数据 3. 数据处理
      而Web服务器的本质就是 接收数据 ⇒ HTTP解析 ⇒ 逻辑处理 ⇒ HTTP封包 ⇒ 发送数据
      高级的服务器无非就是将这三个部分更加细致的设计了。

    二、Web服务器之提供静态文件工作原理图解

    Web服务器最主要的功能是提供静态的文件。日常的上网浏览大多是网页浏览,少数时候才会有一些数据的提交操作。因此,我们结合上一张图示来重点讲解在GET请求下的Web服务器工作原理。
    这里写图片描述
    其他流程基本不变,着重在于红色与蓝色部分。
    (1) 当用户点击一个网页链接或浏览器加载一些资源(css,jpg …)时产生。
    (6) 服务程序解包后,确定其为GET请求,并且是对该服务器上的某一资源的请求。首先服务程序会去确认该路径是否存在,再确定该路径的文件是否可以获取。
    (7-1) 如果请求的路径有误,或者该资源不能被用户获取,则返回错误提示页面。很多服务器的错误页面只有404,更专业的应该是将错误分类并返回对应的错误代码页面。
    (7-2) 如果该路径合法且文件可以被获取,那么服务程序将根据该文件类型进行不同的装载过程,记录其类型作为(8)中HTTP协议中对应的返回类型,并加入响应头。

    假设以点击一个页面链接为例,浏览器首先将HTML文件请求过来,再以同样的流程对HTML文件中包含的资源文件路径进行依次请求。
    这里写图片描述

    三、Web服务器之数据提交工作原理图解

    仅仅只是网页的浏览并不能满足所有人的需求,客户端与服务器应当是有数据交互的。
    即使单方面的资源请求任然是网络的主力军。
    我们应该清楚的知道,数据提交对于用户来说有什么作用。
    (1) 资源上传 (2) 登陆验证 (3) API接口调用 (4) 远程指令等
    数据提交使得用户的操作性有了质的飞跃,它使得HTTP短连接获取静态文件的方式提升到了动态交互的层次上。该性质也催化出各式各样的编程语言、框架。例如PHP,JavaWeb。
    如果你留意目前主流的那些大型服务器,你会发现再高级再牛逼的东西实际是也是最基础的东西建造的。那么我们还可以顺便学习一下最古老的动态技术CGI
    这里写图片描述
    其他流程基本不变,着重在于红色与蓝色部分。
    (1) 用户提交数据,假设用户点击一个按键提交填好的信息。在(3)中将以POST格式写入,并填入提交至服务端的可执行程序的路径。
    (6) 服务端将参数与该CGI绑定,复制进程,用管道传递参数和接收结果
    (7) 子进程执行CGI,接收(6)父进程传来的参数,运算完成返回结果。
    最后父进程将结果装入静态模板文件,放入缓冲区

    四、动态技术

    我们得明白,Web服务器是以短连接为主,并且获取的数据到达浏览器的那一刻一定是静态的不变的。那么所谓动态实际是指两种情况

    1. 服务端产生
      (1) 用户POST提交数据到某个程序,程序根据该数据作为参数运行,得出结果并装入静态的模板页面中,返回该静态页面。但对于用户来说,同一个页面,做了一个操作后数据不一样了。好了,这就是动态页面。(CGI原理)
      (2) PHP的原理是,用户GET请求一个php后缀的文件,服务器先执行该php后缀文件中的PHP代码,将结果填入代码的位置,再返回。当然也可以提交数据参与运算再返回。
    2. 客户端产生
      (1) 用户GET请求一个JavaScript文件,服务端不做任何运算返回该静态文件。浏览器收到该JS文件,在本地执行并更新页面。
      (2) 用户POST提交数据到服务端,服务端根据该提交的数据指令返回静态文件,浏览器收到后执行并更新。
    展开全文
  • WebService技术详解 (一)

    万次阅读 多人点赞 2017-07-25 18:01:18
    WebServiceWebService简介Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 ...

    WebService

    WebService简介

    Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

    简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。

    WebService原理

    XML,SOAP和WSDL就是构成WebService平台的三大技术 。

    • WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。

    • WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。

    • WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。

    WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。

    JAVA WebService规范

    Java 中共有三种WebService 规范,分别是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。

    (1)JAX-WS:

    JAX-WS(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC,二者最大的区别就是RPC/encoded 样式的WSDL,JAX-WS 已经不提供这种支持。JAX-RPC 的API 从JAVA EE5 开始已经移除,如果你使用J2EE1.4,其API 位于javax.xml.rpc.包。JAX-WS(JSR 224)规范的API 位于javax.xml.ws.包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。

    (2)JAXM&SAAJ:

    JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*包,它是Java EE 的可选包,因此你需要单独下载。

    SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范,其API 位于javax.xml.soap.*包。

    JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节,可以使用JAXM&SAAJ。

    (3)JAX-RS:

    JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。

    WebService入门案例

    服务端的实现

    我们来实现一个天气系统的案例,客户端发送城市名称,服务器端回应相应的天气。

    1.  编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中就是普通接口 
    
    public interface WeatherInterface {
        public String queryWeather(String cityName);
    }
    
    2.  编写SEI实现类,此类作为webservice提供服务类 
    
    @WebService     //@WebService表示该类是一个服务类,需要发布其中的public的方法
    public class WeatherInterfaceImpl implements WeatherInterface {
    
        @Override
        public String queryWeather(String cityName) {
            System.out.println("获取城市名"+cityName);
            String weather="暴雨";    
            return weather;
        }
    
    }
    3.  第三步:发布服务,Endpoint类发布服务,publish方法,两个参数:1.服务地址;2.服务实现类 
    
    public class WeatherServer {
        public static void main(String[] args) {
            Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
        }
    }
    
    4. 测试服务是否发布成功,通过阅读wsdl,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功
    
    //我们在浏览器输入 http://127.0.0.1:12345/weather?wsdl 来获取wsdl文件进行阅读
    
    //wsdl,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.
    
    //现在我们还不知道怎么去阅读,后面我们会详解,只要能获取到,就能确定WebService服务发布成功 

    这里写图片描述

    客户端的实现

    //客户端调用服务有很多种方法,我们先用工具生成客户端代码,后面会详解  
    
    //wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。
    
    1.创建一个客户端空项目,cmd命令行进入此项目的src目录
      使用以下命令生成客户端代码  
    
        wsimport -s . http://127.0.0.1:12345/weather?wsdl
    
        -s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.
         最后面的http….是指获取wsdl说明书的地址
    

    这里写图片描述

    2.编写客户端
    public class WeatherClient {
    
        public static void main(String[] args) {
            //创建服务视图,视图是从wsdl文件的service标签的name属性获取
            WeatherInterfaceImplService weatherInterfaceImplService=new WeatherInterfaceImplService();  
    
            //获取服务实现类,实现类从wsdl文件的portType的name属性获取
            WeatherInterfaceImpl weatherInterfaceImpl=weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class); 
            //获取查询方法,从portType的operation标签获取
            String weather=weatherInterfaceImpl.queryWeather("北京");
            System.out.println(weather);
    
        }
    
    }
    

    至此,我们的客户端就可以获取远程服务端的数据,接下来我们来详解一下各个部分。

    WSDL

    WSDL(Web Services Description Language), web服务描述语言,他是webservice服务端使用说明书,说明服务端接口、方法、参数和返回值,WSDL是随服务发布成功,自动生成,无需编写。

    文档结构

    这里写图片描述

    Service:相关端口的集合,包括其关联的接口、操作、消息等。

    Binding:特定端口类型的具体协议和数据格式规范

    portType: 服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType

    message: 定义一个操作(方法)的数据参数

    types: 定义 web service 使用的全部数据类型

    阅读方式

    WSDL文档应该从下往上阅读。

    1.先看service标签,看相应port的binding属性,然后通过值查找上面的binding标签。

    2.通过binding标签可以获得具体协议等信息,然后查看binding的type属性

    3.通过binding的type属性,查找对应的portType,可以获得可操作的方法和参数、返回值等。

    4.通过portType下的operation标签的message属性,可以向上查找message获取具体的数据参数信息。

    SOAP

    SOAP即简单对象访问协议,他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。

    SOAP=http+xml

    SOAP结构

    必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
    可选的 Header 元素,包含头部信息
    必需的 Body 元素,包含所有的调用和响应信息
    可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
    

    这里写图片描述

    我们来看一下我们上面天气程序发送的数据的格式,这需要一个工具TCP/IP Monitor ,Eclipse自带的Debug工具之一,用于捕获Http、TCP/IP协议包。原理是一个代理服务,客户端先把数据发送到代理服务,然后代理服务再把数据发送到服务器,这样就能获取请求数据和响应数据。

    第一步:打开这个工具,选择other,然后输入TCP/IP Monitor

    这里写图片描述

    第二步:设置要代理的服务器

    这里写图片描述

    第三步:详细设置

    第一个参数是代理服务器端口,我们设置为54321
    第二个参数是被代理服务器的地址,第三个参数是被代理服务器的端口
    第四个参数要选择为TCP/IP
    

    这里写图片描述

    第四步:检测是否设置成功,我们访问代理服务器来获得wsdl文件

    这里写图片描述

    第五步:设置成功后,我们需要改一下客户端要连接的服务器,改成代理服务器的端口

    将WeatherInterfaceImplService里的所有原来地址的端口改为54321
    

    这里写图片描述

    第六步:我们启动我们的客户端,获取请求数据和响应数据

    
    请求 
    
    //先发送get请求,去获得wsdl文件,然后获得方法、参数等信息
    GET /weather?wsdl HTTP/1.1
    User-Agent: Java/1.8.0_111
    Host: 127.0.0.1:54321
    Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Connection: keep-alive
    
    //发送数据
    POST /weather HTTP/1.1
    Accept: text/xml, multipart/related
    Content-Type: text/xml; charset=utf-8
    SOAPAction: "http://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest"
    User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
    Host: 127.0.0.1:54321
    Connection: keep-alive
    Content-Length: 203
    
    <?xml version="1.0" ?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
    <ns2:queryWeather xmlns:ns2="http://ws.cad.com/">
    <arg0>北京</arg0>
    </ns2:queryWeather>
    </S:Body>
    </S:Envelope>
    
    响应数据 
    
    HTTP/1.1 200 OK
    Date: Tue, 25 Jul 2017 05:05:58 GMT
    Transfer-encoding: chunked
    Content-type: text/xml;charset=utf-8
    
    //响应wsdl内容,来获得方法、参数等信息
    899
    <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.cad.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.cad.com/" name="WeatherInterfaceImplService">
    <types>
    <xsd:schema>
    <xsd:import namespace="http://ws.cad.com/" schemaLocation="http://127.0.0.1:54321/weather?xsd=1"></xsd:import>
    </xsd:schema>
    </types>
    <message name="queryWeather">
    <part name="parameters" element="tns:queryWeather"></part>
    </message>
    <message name="queryWeatherResponse">
    <part name="parameters" element="tns:queryWeatherResponse"></part>
    </message>
    <portType name="WeatherInterfaceImpl">
    <operation name="queryWeather">
    <input wsam:Action="http://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest" message="tns:queryWeather"></input>
    <output wsam:Action="http://ws.cad.com/WeatherInterfaceImpl/queryWeatherResponse" message="tns:queryWeatherResponse"></output>
    </operation>
    </portType>
    <binding name="WeatherInterfaceImplPortBinding" type="tns:WeatherInterfaceImpl">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
    <operation name="queryWeather">
    <soap:operation soapAction=""></soap:operation>
    <input>
    <soap:body use="literal"></soap:body>
    </input>
    <output>
    <soap:body use="literal"></soap:body>
    </output>
    </operation>
    </binding>
    <service name="WeatherInterfaceImplService">
    <port name="WeatherInterfaceImplPort" binding="tns:WeatherInterfaceImplPortBinding">
    <soap:address location="http://127.0.0.1:54321/weather"></soap:address>
    </port>
    </service>
    </definitions>
    0
    
    //响应数据
    HTTP/1.1 200 OK
    Date: Tue, 25 Jul 2017 05:05:59 GMT
    Transfer-encoding: chunked
    Content-type: text/xml; charset=utf-8
    
    df
    <?xml version="1.0" ?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:queryWeatherResponse xmlns:ns2="http://ws.cad.com/">
        <return>暴雨</return> 
        </ns2:queryWeatherResponse> 
    </S:Body>
    </S:Envelope>
    0
    

    UDDI

    UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
    如果我们要使用一种服务,但是不知道地址(wsdl等),我们就可以在UDDI中查找。
    大部分情况下,我们都是知道服务地址的。

    Webservice的客户端调用方式

    一:生成客户端调用方式

    wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).
    wsimport.exe位于JAVA_HOME\bin目录下 
    常用参数为:
            -d<目录>  - 将生成.class文件。默认参数。
            -s<目录> - 将生成.java文件。
            -p<生成的新包名> -将生成的类,放于指定的包下
    

    调用公网的手机归属地查询服务

    公网服务地址 (里面提供了很多免费调用的服务)
    http://www.webxml.com.cn/zh_cn/index.aspx

    第一步:wsimport生成客户端代码 
    
    wsimport -p cn.cad.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
    
    会出现一些警告,是因为服务端提供的一些方法是SOAP1.2标准的,这个工具没有实现SOAP1.2标准的生成方式。    
    

    这里写图片描述

    第二步:查看wsdl文件,获取我们需要的信息 

    这里写图片描述

    第三步:根据获取到的服务名等信息来创建我们的客户端  
    
    public class MobileClient {
    
        public static void main(String[] args) {
            //创建服务视图
            MobileCodeWS mobileCodeWS=new MobileCodeWS();
            //获取服务实现类
            MobileCodeWSSoap mobileCodeWSSoap= mobileCodeWS.getPort(MobileCodeWSSoap.class);
            //调用查询方法
            String message=mobileCodeWSSoap.getMobileCodeInfo("xxxxxxxx", null);
            System.out.println(message);
    
        }
    }
    
    第四步:获取到信息 

    这里写图片描述

    还有天气等服务,自己可以去实现一下。

    该种方式使用简单,但一些关键的元素在代码生成时写死在生成代码中,不方便维护,所以仅用于测试。

    二:service编程调用方式

    public class MobileClient2 {
    
        public static void main(String[] args) throws IOException {
            //创建WSDL文件的URL
            URL wsdlDocumentLocation=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); 
            //创建服务名称
            //1.namespaceURI - 命名空间地址
            //2.localPart - 服务视图名
            QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS");
            Service service=Service.create(wsdlDocumentLocation, serviceName);
    
            //获取服务实现类
            MobileCodeWSSoap mobileCodeWSSoap= service.getPort(MobileCodeWSSoap.class);
            //调用方法
            String message=mobileCodeWSSoap.getMobileCodeInfo("XXXXXXX", null);
            System.out.println(message);
    
        }
    
    }

    该种方式可以自定义命名空间,服务视图名等元素,方便以后维护,是一种标准的开发方式 。

    三:HttpURLConnection调用方式

    这种方式是由自己编写客户端,不再由工具生成,比较麻烦。

    开发步骤: 
    
            第一步:创建服务地址
    
            第二步:打开一个通向服务地址的连接
    
            第三步:设置参数
    
            第四步:组织SOAP数据,发送请求
    
            第五步:接收服务端响应 
    
    public class MobileClient2 {
    
        public static void main(String[] args) throws IOException {
                    //第一步:创建服务地址,不是WSDL地址
                    URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
                    //第二步:打开一个通向服务地址的连接
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    //第三步:设置参数
                    //3.1发送方式设置:POST必须大写
                    connection.setRequestMethod("POST");
                    //3.2设置数据格式:content-type
                    connection.setRequestProperty("content-type", "text/xml;charset=UTF-8");
                    //3.3设置输入输出,因为默认新创建的connection没有读写权限,
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
    
                    //第四步:组织SOAP数据,发送请求
                    String soapXML = getXML("XXXXXXX");
                    OutputStream os = connection.getOutputStream();
                    os.write(soapXML.getBytes());
                    //第五步:接收服务端响应,打印
                    int responseCode = connection.getResponseCode();
                    if(200 == responseCode){//表示服务端响应成功
                        InputStream is = connection.getInputStream();
                        //将字节流转换为字符流
                        InputStreamReader isr = new InputStreamReader(is,"utf-8");
                        //使用缓存区
                        BufferedReader br = new BufferedReader(isr);
    
                        StringBuilder sb = new StringBuilder();
                        String temp = null;
                        while(null != (temp = br.readLine())){
                            sb.append(temp);
                        }
                        System.out.println(sb.toString());
    
                        is.close();
                        isr.close();
                        br.close();
                    }
    
                    os.close();
                }
    
        //组织数据,将数据拼接一下
        public static String getXML(String phoneNum){
            String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
            +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                +"<soap:Body>"
                +"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
                    +"<mobileCode>"+phoneNum+"</mobileCode>"
                  +"<userID></userID>"
                +"</getMobileCodeInfo>"
              +"</soap:Body>"
            +"</soap:Envelope>";
            return soapXML;
        }
    }

    这里写图片描述

    使用注解修改WSDL内容

    作用:
    通过注解,可以更加形像的描述Web服务。对自动生成的wsdl文档进行修改,为使用者提供一个更加清晰的wsdl文档

    WebService的注解都位于javax.jws包下: 
    
    @WebService-定义服务,在类上边
        targetNamespace:指定命名空间
        name:portType的名称
        portName:port的名称
        serviceName:服务名称
        endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。 
    
    @WebMethod-定义方法,在公开方法上边
        operationName:方法名
        exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false 
    
    @WebResult-定义返回值,在方法返回值前边
        name:返回结果值的名称 
    
    @WebParam-定义参数,在方法参数前边
        name:指定参数的名称
    
    //以我们前面做的天气案例为例子
    
    @WebService(
            targetNamespace="http://service.cad.com",
            portName="WeatherSOAPPort",
            serviceName="WeatherWSS",
            name="WeatherSOAP"  
    )
    public class WeatherInterfaceImpl implements WeatherInterface {
    
        @WebMethod(
                operationName="getWeather",
                exclude=false
        )
        public @WebResult(name="result")String queryWeather(@WebParam(name="cityName")String cityName) {
            System.out.println("获取城市名"+cityName);
            String weather="暴雨";    
            return weather;
        }
    
    }
    然后重新发布服务,我们再访问wsdl文件,就可以看到我们改变的内容 

    这里写图片描述

    展开全文
  • linux下搭建基本web服务

    万次阅读 2018-09-01 08:36:14
    服务端配置:1.安装一个可以提供Web功能软件[root@server0 ~]# yum -y install httpd2.启动httpd服务[root@server0 ~]# systemctl restart httpd[root@...编写自己的测试页面文件在web服务中默认存放网页文件的路...

    服务端配置:

    1.安装一个可以提供Web功能软件

    [root@server0 ~]# yum -y install httpd

    2.启动httpd服务

    [root@server0 ~]# systemctl restart httpd
    [root@server0 ~]# systemctl enable httpd


    3.编写自己的测试页面文件

    在web服务中默认存放网页文件的路径:/var/www/html

    默认网页文件名字:index.html

    [root@server0 ~]# vim /var/www/html/index.html

    <marquee><font color=red><h1>hello world!


    客户端访问

    [root@desktop0 /]# firefox 172.25.0.11








    展开全文
  • WEB服务(一)

    2020-09-24 08:59:12
    Apache服务 一, Apache网站服务基础 Apache HTTP Server 是广泛应用的Web应用系统之一,要运用好它,必须先了解它的特点及其编译安装过程。 1.Apache简介 ​ Apache HTTP Server是开源软件项目的杰出代表,基于标准...
  • web 服务器有哪些

    万次阅读 2018-08-27 16:53:49
    什么是web服务器 "网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源。 Web Service架构和云 如果一个软件的主要部分采用了"网络服务",即它把存储或计算环节"外包"...
  • web service概念、架构及相关知识

    万次阅读 2016-04-11 14:42:33
    WebService通常被定义为一组模块化的API,我们可以通过网络进行调用,来执行远程系统的请求服务。 WebService就是暴露给外部使用的,可通过web调用的一组API。 WebService是一种跨编程语言和跨操作系统平台的远程
  • 什么是web服务

    千次阅读 2006-10-14 11:48:00
    许多人由此断定互联网是被大家过分炒作了,事实上网络泡沫和相继而来的股市大衰退是所有技术革命的共同特征。股市大衰退通常标志着蒸蒸日上的技术已经开始占领中央舞台...“Web 2.0”的概念开始于一个会议中——OReill
  • 实现webservice的几种方式

    万次阅读 多人点赞 2018-10-25 18:09:52
    1, WebService是两个系统的远程调用,使两个系统进行数据交互,如应用:天气预报服务、银行ATM取款、使用邮箱账号登录各网站等。 2, WebService之间的调用是跨语言的调用。Java、.Net、php,发送Http请求,使用的...
  • Win10 IIS Web服务器安装与配置

    万次阅读 多人点赞 2018-01-04 21:53:00
    这几天课程实训,使用 IIS 配置服务器,课本上内容太久,老师也没有讲过,自己摸索了一下,所以记录一下 安装 IIS 打开程序和功能,选择左边启用或关闭 Windows 功能,建议根据下图勾选,确定后等待安装完成 ...
  • web服务器和应用服务器的区别与分析

    万次阅读 多人点赞 2018-07-10 15:28:21
    Apache是世界使用排名第一的Web服务器。它可以运行在几乎所有广泛使用的计算机平台上。源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满...
  • WEB服务器与应用服务器的区别

    万次阅读 多人点赞 2012-06-13 23:42:43
    理解WEB服务器,首先你要理解什么是WEB?WEB你可以简单理解为你所看到的HTML页面就是WEB的数据元素,处理这些数据元素的应用软件就叫WEB服务器,如IIS、apache。 WEB服务器与客户端打交道,它要处理的主要信息有:...
  • web服务器和web框架的作用及其关系

    千次阅读 多人点赞 2018-10-15 21:24:27
    web服务器和web框架的作用及其关系 1.web服务器作用: 1)解析请求报文,调用框架程序处理请求。 2)组织响应报文,返回内容给客户端。 2.web框架程序的作用: 1)路由分发(根据url找到对应的处理函数) 。 2)在处理...
  • Web服务器及性能优化

    万次阅读 2018-08-09 07:03:34
    一、WEB服务器 1.1 概述: 1.2 区别: 1.2.1 Apache 1.2.2 Tomcat 1.2.3 Jboss 二、浏览器端,关于浏览器端优化 2.1 压缩源码和图片 2.2 选择合适的图片格式 2.3 合并静态资源 2.4 开启服务器端的Gzip压缩 2.5 ...
  • 使用Linux搭建web服务器

    万次阅读 2018-01-04 19:39:53
    对于一个网站开发者而言,在经历了艰难的开发过程后,要将网站推向给用户,必须要做的一步便是部署我们的web应用,这样广大的用户才能成功访问我们的网站。目前主流的部署平台都是基于Linux的。本文将详细讲解使用...
  • 常见Web服务器简介

    万次阅读 2014-08-11 18:37:59
    常见Web服务器简介   Web服务器也称为WWW (WORLD WIDE WEB)服务器、HTTP服务器,其主要功能是提供网上信息浏览服务。  Unix和Linux平台下的常用Web服务器有Apache,Nginx,Lighttpd,Tomcat,IBM WebSphere、BEA...
  • 主流web服务器介绍

    千次阅读 2014-05-02 13:54:39
     本文主要描述几种主流web服务器之间的对比,以便在不同的场景下,选择不同的web服务器,分为基本概念、web服务器、web容器对比 基本概念:  1. 应用服务器:通过各种协议,包括http协议,把业务逻辑暴露给...
  • Web应用程序  (1)什么是Web应用程序  应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览 器端/服务器端应用程序,这类应用程序一般借助浏览器来运行。 ...
  • 一 常见的WEB服务器和应用服务器 ... 在选择使用WEB服务器应考虑的本身特性因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等,下面介绍几种常用的WEB服务器。  常见的w
  • Java中常用WEB服务器和应用服务器

    万次阅读 2018-06-29 15:20:31
    一、web服务器和应用服务器的区别 Web服务器传送页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是...
1 2 3 4 5 ... 20
收藏数 2,011,370
精华内容 804,548
关键字:

web服务