构建REST风格的Web Service

2023-10-27

1.什么是REST?
REST 是由 Roy Fielding 在他的论文Architectural Styles and the Design of Network-based Software Architectures中提出的一个术语。
REST 是英文 Representational State Transfer 的缩写,有中文翻译为具象状态传输(参考:SIP/IMS网络中的Representational State Transfer (REST)和数据分布》)。
可以将REST归纳如下:
 
1.1首先REST只是一种风格,不是一种标准
<td 230,="" 230)="" none="" repeat="" scroll="" 0%="" 50%;="" -moz-background-clip:="" -moz-initial;="" -moz-background-origin:="" -moz-background-inline-policy:="" width:="" 426.1pt;"="" valign="top" width="568" style="padding: 0cm 5.4pt; margin: 0px; border: 1pt solid windowtext;">
You will not see the W3C putting out a REST specification. You will not see IBM or Microsoft or Sun selling a REST developer's toolkit. Why? Because REST is just an architectural style. You can't bottle up that style. You can only understand it, and design your Web services in that style.
- Roger L. Costello Building Web Services the REST Way
 
1.2  REST是以资源为中心的
REST中,认为Web是由一系列的抽象资源(Abstract Resource)组成,这些抽象的资源具有不同的具体表现形式((Representational State)。譬如,定义一个资源为photo,含义是照片,它的表现形式可以是一个图片,也可以是一个.xml的文件,其中包含一些描述该照片的元素。或是一个html文件。并且这些具体的表现可以分布在不同的物理位置上。
 
1.3  REST的目的是决定如何使一个定义良好的 Web程序向前推进
一个程序可以通过选择一个Web页面上的超链(这些链接代表资源),使得另一个Web页面 (Representational State of an abstract resource) 返回(transfer)到用户,使程序进一步运行。
 
1.4  REST充分利用或者说极端依赖HTTP协议
它通过逻辑URI定位资源
 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现(或者说暴露)一个资源。
这里必须注意
1,一个URI对应一个资源。
2,这里的URI是一个逻辑URI
一个逻辑 URI [url]http://www.example.com/photo/logo[/url]
一个物理 URI [url]http://www.example.com/photo/logo.html[/url]
 
通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
我们来看一个实际例子:
[url]http://www.example.com/photo/logo[/url] 指向 example.com 网站(可以视为一个 Web 应用)中类型为photo,名字为 logo 的资源。我们用浏览器访问这个 URI,看到的将可能是一个 html 文档,其中用 <img src=”……” /> 来显示实际的照片。
[url]http://www.example.com/photo/logo[/url]这个地址很可能会在服务器内部处理为[url]http://www.example.com/photo.jsp?name=logo[/url] 这样的地址。photo.jsp 是服务器端的一个动态脚本文件,根据 name 参数生成 html 文档返回给浏览器。
现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取同一个资源的不同表现形式的数据。对于这个要求,我们可以很容易的用另一个 URL地址达到:[url]http://www.example.com/xml/logo[/url]
但是,这就违背了URI 唯一标识一个资源的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI
而在REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是[url]http://www.example.com/photo/logo[/url]
那这是怎么办到的呢?是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。
只要我们指定一个特定的 Accept 参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。
如果考虑为 Web 应用增加 Web Services,这种技术的价值就体现出来了比如写了一个程序,现在只需要构造一个包含 Accept: text/xml  HTTP 请求头,然后将请求发送到[url]http://www.example.com/photo/logo[/url] 就可以了。返回的结果就是一个 XML 文档,而不是别的资源形式的数据。
 
 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作
我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET  POST 这两种 HTTP 请求方法。实际上,HTTP 还有HEADPUTDELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:
Ø POST: 创建
Ø GET: 读取
Ø PUT: 更新
Ø DELETE: 删除
经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过【同一个 URI】 完成了:
[url]http://www.example.com/photo/logo[/url](读取)
仍然保持为 [GET] [url]http://www.example.com/photo/logo[/url]
[url]http://www.example.com/photo/logo/create[/url](创建)
改为 [POST] [url]http://www.example.com/photo/logo[/url]
[url]http://www.example.com/photo/logo/update[/url](更新)
改为 [PUT] [url]http://www.example.com/photo/logo[/url]
[url]http://www.example.com/photo/logo/delete[/url](删除)
改为 [DELETE] [url]http://www.example.com/photo/logo[/url]
从而进一步规范了资源标识的使用。
通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并对资源提供语义一致的操作服务。这对于以资源为中心的 Web 应用来说非常重要。
**************************************************************************************************************************************************************************************
*******************************【总结:用同一个url(保证了一个资源仅对应一个url)+不同的请求方法(get、put、post、delete)】*************************************
*****************************************************************************************************************************************************************************************
2RESTful Web Services 特点
通过将【HTTP Accept类型】设置为text/xml,我们便可以将资源返回的“具象状态”表示为可跨平台识别的数据。这是应用于Web Services的基础。
*****************************(“具象状态:如前所述的一张照片可以是image形式的也可以是xml格式的或者其他表现形式”)*****************************
RESTful Web Service具有以下特点:
2.1无状态的
每一个来自客户端的request必须包含所有必要的信息,即不能从服务器端获得任何保存的上下文信息。
REST  “客户机-无状态-服务器” 约束禁止在服务器上保存会话状态。符合这一约束进行设计
1,可以提高系统的可靠性和可伸缩性。它不需要昂贵的维护和支持费用,因为状态并不在服务器上维护。
2,可以进行资源缓存。Web的高速缓存既可以驻留在客户主机中,也可以驻留在中间网络高速缓存服务器主机中。
 
2.2  HTTP头中可见的统一接口和资源地址
通过对于HTTP Head 的解析,我们便可以了解到当前所请求的资源和请求的方式。相对于SOAP RPC风格来说,我们必须解析HTTP体。
这样做对于一些代理服务器的设置,将带来很高的处理效率。
REST 系统中所有的动作和要访问的资源都可以从H TTPURI 中得到,这使得代理服务器、缓存服务器和网关很好地协调工作。而RPC 型的SOAP 要访问的资源仅从 URI无法得知,要调用的方法也无法从 HTTP中得知,它们都隐藏在 SOAP 消息中。
同样的,在REST系统中的代理服务器还可以通过 HTTP 的动作 (GET  POST)来进行控制。
 
2.3  返回一般的XML格式内容
一般情况下,一个RESTful Web Service将比一个SOAP RPC Web Service占用更少的传输带宽。
POST/Order HTTP/1.1
Host:[url]www.northwindtraders.com[/url]
Content-Type:text/xml
Content-Length:nnnn
SOAPAction:”urn:northwindtraders.com:PO#UpdatePO”
 
<SOAP-ENV:Envelope
xmlns:xsi=”[url]http://www.3w.org/1999/XMLSchema/instance[/url]”
xmlns:SOAP-ENV=”[url]http://schemas.xmlsoap.org/soap/envelope[/url]”
xsi:schemaLocation=”[url]http://www.northwindtraders.com/schema/NPOSchema.xsd[/url]”>
<SOAP-ENV:Body xsi:type=”NorthwindBody”>
    <UpdatePO>
      <orderID>098</orderID>
      <customerNumber>999</customerNumber>
      <item>89</item>
      <quantity>3000</quantity>
    </UpdatePO>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
 

2.4  安全机制
REST使用了简单有效的安全模型。REST中很容易隐藏某个资源,只需不发布它的U RI;而在资源上也很容易使用一些安全策略,比如可以在每个 URI 针对 4个通用接口设置权限;再者,以资源为中心的 Web服务是防火墙友好的,因为 GET意思就是GET P UT 的意思就是PUT,管理员可以通过堵塞非GET请求把资源设置为只读的,而现在的基于RPC 模型的 SOAP一律工作在 HTTP  POST上。
使用 SOAP RPC模型,要访问的对象名称藏在方法的参数中,因此需要创建新的安全模型。
 
2.5  无法用于事务型的服务
对于事务型的服务,一个简单的例子就是银行事务,在那里用户可以把钱从一个账户转移到另一个账户上。用户不想直接操作资源(钱、银行账户等等),他们只想告诉银行他们想要达到的目的,并且让银行根据他们的利益对资源进行处理。
所以从这一条,我们应该明白,选择基于RESTSOAP RPC风格的Web 服务,我们应该首先考虑这个服务是针对资源的还是针对活动的。
- James Snell面向资源与面向活动的 Web 服务,英文原文
 
3JAX-WS
Java Architecture for XML Web Services的缩写,简单说就是一种用JavaXML开发Web Services应用程序的框架目前版本是2.0, 它是JAX-RPC 1.1的后续版本。
JAX-WS2.0 JAXB2来处理Java ObjectXML之间的映射。
JAX-WS通过javax.xml.ws.Provider接口来构建REST风格的终端。
 
4WADL
Web Application Description Language (WADL) 是由SUN公司提出的,旨在提供一种Web 应用的描述语言。WADL主要描述一个Web 应用的
  • 资源列表-站点所有的资源
  • 资源之间的关系-说明资源之间的链接关系
  • 所有应用于每个资源的特定方法-应用于每个资源的HTTP方法,指定的输入和输出以及它们支持的数据格式
  • 资源表现的形式-支持的MIME类型和所用到的XML schemas
 
下面是一个WADL示例,它描述了Yahoo新闻搜索的应用。
  • Lines 2 开始一个应用描述,定义所使用的namespaces
  • Lines 3–6 定义XML 语法,这个示例中是两个W3C XML Schema
  • Lines 7–11描述了Yahoo新闻搜索Web 资源以及它所支持的HTTP方法。
  • Lines 12–26 描述了‘search’ GET方法
  • Lines 13–21 描述输入
  • Lines 22–25 描述所有可能的输出。
 
5.关于WADL的项目介绍
wadl2java
A tool that generates client side stubs from WADL files. May be used from the command line or as an Apache Ant plug-in, see the wadl2java documentation for full details.
wadl2java_yahoo
A sample project that uses the wadl2java tool to create stubs for the Yahoo News Search Service. Includes a simple main method that uses the generated stubs to query for the latest Java news.
 
6.建议阅读的资料
[2] RESTwiki
[6] 面向资源与面向活动的 Web 服务
[8]WADL语言作者Marc Hadley's Blog

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/47283


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建REST风格的Web Service 的相关文章

随机推荐

  • 网络规划设计与综合布线技术详解

    一 网络工程概述 1 计算机网络及其组成 计算机网络是现代通信技术与计算机技术相结合的产物 随着计算机网络本身的发展 人们认为 计算机网络是把地理位置不同 功能独立自治的计算机系统及数据设备通过通信设备和线路连接起来 在功能完善的网络软件运
  • jQuery 绑定3种表单事件 change(value值改变),focus(获到焦点),blur(失去焦点)

    1 change 说明 元素的value值改变时 触发change事件 change事件只适用于文本框 text 文本域 textarea 下拉框 select 元素 语法 selector change function1 实例 文本框
  • 编译原理——词法分析器

    1 概述 设计 编制并调试一个简单的C语言词法分析程序 掌握利用状态转换图设计词法分析器的基本方法 利用该词法分析器完成对源程序字符串的词法分析 通过对该词法分析器的设计 加深对词法分析原理 状态转换图等编译原理知识的理解 2 使用的基本概
  • 最新bilibili怎么下载视频

    bilibili作为最火的二次元网站 很多人想下载下来 却不知道怎么下手 今天小编就来818怎么下载bilibili的视频 1 我们拿这案例来参考 https www bilibili com video av40672186 from s
  • d3碰撞源码分析

    技术 d3 d3 force d3 geom quadtree d3 geom quadtree 四叉树的应用 图像处理 空间数据索引 2D中的快速碰撞检测 存储稀疏数据等 游戏编程 上图中的数据就是普通的点 点与点之间没有关系 此函数在构
  • TOJ--3100:Getting Gold (DFS)

    1 题目源地址 http acm tju edu cn toj showp3100 html 2 源代码 TOJ 3100 Getting Gold include
  • httprunner接口自动化测试框架使用说明【保姆级教程】

    背景介绍 httprunner是国内开源的一个接口自动化框架 已经有部分公司开始使用这种框架来完成自己公司的接口自动化编写 本文主要是从简单的流程上去讲解咋使用的 PS 开发者本尊的官网教程写的是真的烂 一点也不友好 里面各种坑 本文基于h
  • Java基础——封装、继承、多态

    今天我们来了解一下面向对象的三大特性 封装 继承和多态 封装 把属性和实现细节隐藏起来 不让外界直接访问 提供公共的方法访问方式 private A 只能修饰成员 B 被private修饰的成员只能在本类中访问 外界不可以直接访问 C pr
  • cocos2d-x 地图随英雄移动

    本人刚开始学习cocos2d x游戏引擎 学到瓦片地图这块 网上有一个很经典的例子 见链接 基于Cocos2D X的砖块地图教程 一 在看到其中的地图跟随角色移动 一般情况下保持角色在屏幕中央附近 到地图边缘时移动角色 的问题时看的不大明白
  • reference to ‘ max‘ is ambiguous

    今天写C 算法的时候 声明了一个全局遍历max 来记录最短路径 编译发现遇到一个以前没遇到过的错误 reference to max is ambiguous 翻译过来就是对 max 的引用有歧义 通过查询百度发现 原因是我引用了iostr
  • c++中如何实现十进制(Dec)与十六进制(Hex)之间的相互转换

    c 中如何实现十进制 Dec 与十六进制 Hex 之间的相互转换 1 十进制 gt 十六进制 include stdafx h include iostream include string using namespace std stri
  • 富集分析(GO、KEGG、GSEA)

    library clusterProfiler library org Hs eg db GO分析与KEGG分析 GO分析需要一个基因 symbol列表 列表中为差异表达基因 一 读入数据 result lt read csv file R
  • 凡科网JS逆向后跳出的滑块验证(base64图片解码之后的破解滑块验证)

    目录 1 前提和大概思路概述 2 转换思路selenium和验证滑块图片的获取处理 3 总结 1 前提和大概思路概述 只是学习的途中有一些新的发现 分享给大家 希望对你们有帮助 凡科网的JS逆向的闭包技巧应该是典型的闭包案例 很多人都有讲解
  • STM32 USB学习笔记

    STM32 USB学习笔记 一 USB FS Device firmware library 使用固件库开发程序 需要包含几个文件 从图中可见 应用程序接口部分 有 usb pwr usb conf usb desc usb istr us
  • 中台建设&架构设计

    什么是中台 中台即企业级能力复用平台 企业级 企业级定义了中台的范围 它更多代表的是中台处理的问题在企业级别 即至少包含多条业务线或服务多个前台产品 团队 如果一个中台只为了支持一条业务线或产品线 那就不是中台 即使它用了服务化或是大数据等
  • 谷歌禁止访问测试环境

    谷歌访问测试环境接口报错 主要原因 谷歌阻止了对不安全接口的请求 解决方法 进入谷歌设置 chrome flags block insecure private network requests 将Block insecure privat
  • c++ 定时器_STM32实例定时器中断实验

    上一章我们介绍了 STM32F1的外部中断 这一章我们来学习下定时器中断 STM32F1 的定时器功能非常强大 其包含 2 个基本定时器 TIM6 TIM7 4 个通用定时器 TIM2 TIM5 和 2 个高级定时器 TIM1 TIM8 共
  • 目标检测中anchor box(先验框)的理解

    近来心血来潮 把CV领域关于目标检测的主流方法YOLOv3和Faster RCNN看了一下 对其中的先验框 anchor box 一直不太理解 在广泛地阅读了一些相关讲解后 有了一定的理解 在此记录一下 先验框的个人理解 先验框最早提出于F
  • 限定特定的IP访问服务器

    需求 windows and Linux系统仅限指定的IP或网段登陆 解决方法和思路 1 Windows设置的方法有多种 方法一 通过本机自带的防火墙设置限制IP访问 修改下面三个规则属性 点击属性 查看对应设置 设定可以访问的地址段或IP
  • 构建REST风格的Web Service

    1 什么是REST REST 是由 Roy Fielding 在他的论文 Architectural Styles and the Design of Network based Software Architectures 中提出的一个术