首先要明确一点:REST 实际上只是一种设计风格,它并不是标准。(所以你可以看到网上一大堆的各种最佳实践,设计指南,但是没有人说设计标准)。

说说几个重要的概念:

1、REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露。
URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,操作是通过 HTTP动词来体现,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词。

比如:左边是错误的设计,而右边是正确的

 
  1. GET /rest/api/getDogs --> GET /rest/api/dogs 获取所有小狗狗

  2. GET /rest/api/addDogs --> POST /rest/api/dogs 添加一个小狗狗

  3. GET /rest/api/editDogs/:dog_id --> PUT /rest/api/dogs/:dog_id 修改一个小狗狗

  4. GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 删除一个小狗狗

左边的这种设计,很明显不符合REST风格,上面已经说了,URI 只负责准确无误的暴露资源,而 getDogs/addDogs...已经包含了对资源的操作,这是不对的。相反右边却满足了,它的操作是使用标准的HTTP动词来体现。

2、REST很好地利用了HTTP本身就有的一些特征,如HTTP动词、HTTP状态码、HTTP报头等等
REST API 是基于 HTTP的,所以你的API应该去使用 HTTP的一些标准。这样所有的HTTP客户端(如浏览器)才能够直接理解你的API(当然还有其他好处,如利于缓存等等)。REST 实际上也非常强调应该利用好 HTTP本来就有的特征,而不是只把 HTTP当成一个传输层这么简单了。

HTTP动词

 
  1. GET 获取一个资源

  2. POST 添加一个资源

  3. PUT 修改一个资源

  4. DELETE 删除一个资源

实际上,这四个动词实际上就对应着增删改查四个操作,这就利用了HTTP动词来表示对资源的操作。

HTTP状态码

 
  1. 200 OK

  2. 400 Bad Request

  3. 500 Internal Server Error

在 APP 与 API 的交互当中,其结果无非就三种状态:

  • 所有事情都按预期正确执行完毕 - 成功
  • APP 发生了一些错误 – 客户端错误
  • API 发生了一些错误 – 服务器端错误

这三种状态与上面的状态码是一一对应的。

HTTP报头

 
  1. Authorization 认证报头

  2. Cache-Control 缓存报头

  3. Cnotent-Type 消息体类型报头

  4. ......

报头还有很多,不一一列举。HTTP报头是描述HTTP请求或响应的元数据,它的作用是客户端 与 服务器端进行相互通信时,告诉对方应该如何处理本次请求。

3、超媒体
老实说,这个词汇我到目前还有没搞得全懂。那也说说自己的理解吧,不一定准确哦,有错误希望指出。
”超媒体“ 你没听说过没关系,”超链接“ 你一定不会陌生。简单来说,”超链接“ 是实现超媒体中的一种方式。”超媒体“希望达到一种就是说在 REST API 中把所有资源给链接起来。它就犹如你打开一个网站的首页,你难道看到的只有首页吗?NO !, 不是的,你可以通过首页查看商品、查看文章、查看论坛。”超媒体“ 就是做这个事情,它利用 API 把所有资源的关系给链接起来了,你看到不会只是一个独立的资源,而是关系网中的一个资源。
”超媒体“ 有点高大上了,老实说,就算你够牛X,写出了一个非常棒的符合”超媒体“的REST API,你的用户即开发者,也不一定能够接受你这种高大上的设计。当然,我相信未来也许可以普及了。

4、最后
上面只是简单说了一些自己最近做REST的一些体验吧。有关于REST的介绍文章实在是太多了,当然很多写得也非常不错,我这里 aisuhua/restful-api-design-references · GitHub 收集了一些,喜欢的话可以看看,有更好的可以推荐给我。对于上面的回答,有任何不对,都希望您能指出,大家共同进步,谢谢大家!

链接:https://www.zhihu.com/question/28557115/answer/47846156

RPC和REST区别相关推荐

  1. spring cloud和普通rpc框架的区别

    spring cloud和普通rpc框架的区别 补了一部分,后续再补 背景 其实本文标题有点不对,Spring Cloud也是一种RPC框架,但是区别是它使用的是http协议的传输,整体技术和普通RP ...

  2. Http和Rpc框架的区别

    虽然现在服务间的调用越来越多地使用了 RPC 和消息队列,但是 HTTP 依然有适合它的场景. RPC 的优势在于高效的网络传输模型(常使用 NIO 来实现),以及针对服务调用场景专门设计协议和高效的 ...

  3. GPRC 和RPC 有什么区别?GPRC和RPC的区别是什么?

    什么是RPC? RPC (Remote Procedure Call)是远程过程调用,比如说现在有两台服务器A, B,一个在A服务器上的应用想要调用B服务器上的应用提供的某个,由于不在两个方法不在一个 ...

  4. RPC协议与Http协议区别

    RPC调用 RPC是远程过程调用(Remote Procedure Call)的缩写形式.SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部 ...

  5. 远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合

    在阿里的平台技术部参与开发了Dubbo(远程调用服务)和Napoli(消息解决方案),又给网站应用支持这2个产品很长一段时间,了解了这2个产品的实现及应用对这两个产品的用法. 大部分情况下," ...

  6. HTTP VS RPC

    先再次重复强调一遍,通信协议不是 rpc 最重要的部分,不要被这类回答带偏.如果要了解 rpc 请更多的去了解服务治理(SOA)的一些基本策略,推荐去看看 dubbo 的相关文档. 一.详解 rpc是 ...

  7. rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)

    分布式微服务治理的核心在于: 微服务和分布式 (微服务框架)微服务的最优技术实现目前是: SpringBoot (RPC 框架)分布式的最优技术实现目前是: Thrift,Motan,Dubbo,Sp ...

  8. 网络协议 22 - RPC 协议(下)- 二进制类 RPC 协议

    网络协议 22 - RPC 协议(下)- 二进制类 RPC 协议 原文:网络协议 22 - RPC 协议(下)- 二进制类 RPC 协议     前面我们认识了两个常用文本类的 RPC 协议,对于陌生 ...

  9. RPC(Remote Procedure Call)远程过程调用

    所谓的RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制, 使得应用之间可以进行通讯,而且也遵从server/client模型. 使用的时候客户端调用serve ...

最新文章

  1. ORACLE12C_ADG删除pdb
  2. 局域网***-Dos***CDP
  3. ecmall开发记录(三)
  4. SAP SF打印次数统计
  5. how to handdraw a web UI for applications? Figma
  6. Lintcode--4(1)--A+B
  7. PHPJavaScript笔记-后端利用Refresh头带错误信息给前端(野路子操作)
  8. 转角遇上Volcano,看HPC如何应用在气象行业
  9. 原创:PHP乱码怎么办?五种方法彻底解决PHP乱码问题
  10. 一加9系列全网预约量破200万:3月24日见!
  11. 快来学习一下吧!Web前端开发CSS居中的五大方式
  12. 【转】Struts2 严重: Dispatcher initialization failed java.lang.RuntimeException
  13. 常用正则表达式归类贴
  14. 编程基础(四)——cache之一
  15. 三维平面叠加图_无人机倾斜摄影技术在三维实景GIS的应用
  16. 从零开始学android:Activity初步
  17. erp软件涉及哪些计算机技术?,ERP软件应该学习哪些内容?
  18. windows域用户切换本地用户
  19. 为什么从Java开发转测试?
  20. 卫星导航定位误差之电离层、对流层

热门文章

  1. 没有bug队——加贝——Python 练习实例 15,16
  2. ip地址自动切换器_网络IP切换器IPProviders下载_IPProviders官方版下载1.1.22
  3. mysql 多项式_mysql主从复制原理及实现
  4. 怎样把电脑恢复出厂设置_数据蛙:苹果恢复出厂设置,彻底释放手机内存
  5. 74ls90设计十进制计数器电路图_PLC控制系统的设计与调试步骤你知多少?
  6. 升级锦囊 | 测试开发核心技术46讲
  7. IntelliJ IDEA 如何导出安卓(Android)apk文件 详细教程
  8. 怎样使用navicat将mysql的数据表导出保存(转储SQL文件)
  9. 爬虫前期知识的储备(二)
  10. 简述openstack