什么是RESTful Web Service?
时间:2022-05-03
本文章向大家介绍什么是RESTful Web Service?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 什么是Restful
其实早在web service概念产生前就有了restful的概念,或者说restful是和Http一起诞生的。
可以参阅 Roy Fielding 的论文“Architectural Styles and the Design of Network-based Software Architectures”, 我本身并没有读过。
Restful的意思是‘宁静的’,你可以理解为‘简约而不简单’,或者‘和谐的’。一个协议只有足够的简约才有扩展性和生命力,复杂的东西往往伴随的是大量bug和规模膨胀后的不可控。
Restful就是Http的本质,仅仅是一个资源URI,和Get,Post,Put,Delete四种操作。一切Web的行为皆源于此。
所以早期的网站,或者说是静态的网站的都是Restful的,如果广义的把浏览器获取web page当做一种web service的话,那么他们都提供了Restful Web Service。
所以Restful并不是个陌生的概念,更不是个新的概念,只不过是一直被忽略了。
一样东西之所以被忽略,因为没有对立面, 或者说没有可比较的东西。世界上的概念都是相对的,有了丑才有美,有了胖才有瘦。
同样当仅仅只有restful的时候,便很少有人真正了解restful的意思。
直到有一天,restful的原则被打破,世界上出现了非restful的web行为,我们可以把它称做‘RPC-style’的web service。2. RPC-style
RPC是个大家都很熟悉的东西,remote procedure call,就是说我要调用其他机器上的程序就象调用我本机的函数一样。
早期的做法开个socket端口,把参数传过去,然后执行完再通过socket把结果传回来。
这样的缺点是就是不同的解决方案的传参数和结果的协议不同,大家之间没发通用,还有就是可能无法穿越防火墙。
直到XML技术诞生,用XML来规范接口,并且XML文档本身就是纯文本可以方便的通过Http端口传输,这样就大大的方便了在web互相之间的调用。
于是Web Service的概念诞生了,而这种Web Service是‘RPC-style’的。3. Http
顺便聊一下Http协议,Http诞生就是为了进行Web访问,用来传输Html文档的。不过他的能力远远大于此。
Http本身就是个envelope协议,他并不管envelop里面装的是什么,所以其实你可以通过http传输任意数据(图片,音乐),只要可以将它编码成文本(如用base64)。
Http本身规定了4种操作,可是他并没有强制服务器真正的行为。比如你通过Http发出的Get指令,服务器在收到这个指令后可以做些完全和Get不相关的事情。
Http的灵活性带来了很多好处,但同时也带来了副作用,Web不再restful,变的有点小乱。4. ROA
其实RPC-style和Restful看待事物的角度是不同的,大家都说Restful是一种RO,即面向资源的,那么RPC-style应该仍难是传统的OO,即面向对象的。
对于RPC-style而言,Server就是一个对象,这个对象有许多的属性和方法,我们通过http传递参数来调用这些方法,这里http仅仅被用来做为一个传递者,request的真正含义皆在soap envelop中。
对于Restful而言,Server就是个资源的集合,里面有web pages,web services,或其他资源,对于资源的操作是固定的。我们可以用http象访问网页一样访问web service。
对于Web而言,似乎ROA这种架构更能保持web访问的一致性,也更简单。5. Ajax
Ajax出现的初始动机就是我们可以仅仅刷新部分网页,这样更快,也更合理,不然每次都要刷新整个网页。
同时,Ajax的出现也为遵守Restful原则提供了一种很好的solution。
Restful很重要的原则是无状态性,即服务器不会保存http request的上下文。这是很必要的,否则当用户很多时,服务器的负荷会爆掉的。
我们应该在客户端记录request上下文,然后每次发给服务器。
Ajax出现前,每次request都会刷新这个页面,所以很难记录之前request的上下文,现在有了Ajax, 用户不用每次刷新整个页面,所以可以有效的记录上下文。
所以可以比较简单的完成胖客户端-瘦服务器的架构。
详细可参见
http://www.ibm.com/developerworks/cn/web/wa-ajaxarch/
- 快速入门系列--MVC--01概述
- JavaScript图片库
- SMB共享之SCF文件攻击解析
- JavaScript之arguements对象学习
- 让我们一起写出更有效的CSharp代码吧,少年们!
- SQL学习之计算字段的用法与解析
- JavaScript之JS的执行环境和作用域
- GOF设计模式快速学习
- JavaScript之面向对象学习一
- JavaScript之JS实现动画效果
- 深入入门系列--Data Structure--04树
- SQL学习之高级联结(自联结、自然联结、外联接)
- ExtJs学习笔记(21)-使用XTemplate结合WCF显示数据
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打卡群刷题总结0722——颜色分类
- 为什么Python没有main函数?
- 构建对象检测模型
- OpenCV4.4 + YOLOv4 真的可以运行了…..
- 基于分类任务的信号(EEG)处理
- 面试:如何决定使用 HashMap 还是 TreeMap?
- 有理有据:一篇来自前端同学对后端接口的吐槽!
- 【从0到1学算法】选择排序
- 【从0到1学算法】大O表示法
- 锦囊篇|一文摸懂AsyncTask
- 在Substrate链上跑Solidity ERC20智能合约
- 【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!
- 对称二叉树
- 你可能会踩到的一个 Eloquent 小坑
- 谨慎使用 Laravel 的 Model 复制(replicate)功能