RESTful API 是每个程序员都应该了解并掌握的基本知识,我们在开发过程中设计 API 的时候也应该至少要满足 RESTful API 的最基本的要求(比如接口中尽量使用名词,使用 POST 请求创建资源,DELETE 请求删除资源等等,示例:GET /notes/id:获取某个指定 id 的笔记的信息)。

如果你看 RESTful API 相关的文章的话一般都比较晦涩难懂,包括我下面的文章也会提到一些概念性的东西。但是,实际上我们平时开发用到的 RESTful API 的知识非常简单也很容易概括!举个例子,如果我给你下面两个 url 你是不是立马能知道它们是干什么的!这就是 RESTful API 的强大之处!

RESTful API 可以你看到 url + http method 就知道这个 url 是干什么的,让你看到了 http 状态码(status code)就知道请求结果如何。

GET    /classes:列出所有班级POST   /classes:新建一个班级

下面的内容只是介绍了我觉得关于 RESTful API 比较重要的一些东西,欢迎补充。

一、重要概念

REST,即 REpresentational State Transfer 的缩写。这个词组的翻译过来就是"表现层状态转化"。这样理解起来甚是晦涩,实际上 REST 的全称是 Resource Representational State Transfe ,直白地翻译过来就是 “资源”在网络传输中以某种“表现形式”进行“状态转移” 。如果还是不能继续理解,请继续往下看,相信下面的讲解一定能让你理解到底啥是 REST 。

我们分别对上面涉及到的概念进行解读,以便加深理解,不过实际上你不需要搞懂下面这些概念,也能看懂我下一部分要介绍到的内容。不过,为了更好地能跟别人扯扯 “RESTful API”我建议你还是要好好理解一下!

  • 资源(Resource) :我们可以把真实的对象数据称为资源。一个资源既可以是一个集合,也可以是单个个体。比如我们的班级 classes 是代表一个集合形式的资源,而特定的 class 代表单个个体资源。每一种资源都有特定的 URI(统一资源定位符)与之对应,如果我们需要获取这个资源,访问这个 URI 就可以了,比如获取特定的班级:/class/12。另外,资源也可以包含子资源,比如 /classes/classId/teachers:列出某个指定班级的所有老师的信息
  • 表现形式(Representational):"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式比如 json,xml,image,txt 等等叫做它的"表现层/表现形式"。
  • 状态转移(State Transfer) :大家第一眼看到这个词语一定会很懵逼?内心 BB:这尼玛是啥啊? 大白话来说 REST 中的状态转移更多地描述的服务器端资源的状态,比如你通过增删改查(通过 HTTP 动词实现)引起资源状态的改变。ps:互联网通信协议 HTTP 协议,是一个无状态协议,所有的资源状态都保存在服务器端。

综合上面的解释,我们总结一下什么是 RESTful 架构:

  1. 每一个 URI 代表一种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现形式比如 json,xml,image,txt 等等;
  3. 客户端通过特定的 HTTP 动词,对服务器端资源进行操作,实现"表现层状态转化"。

二、REST 接口规范

1、动作

  • GET :请求从服务器获取特定资源。举个例子:GET /classes(获取所有班级)
  • POST :在服务器上创建一个新的资源。举个例子:POST /classes(创建班级)
  • PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /classes/12(更新编号为 12 的班级)
  • DELETE :从服务器删除特定的资源。举个例子:DELETE /classes/12(删除编号为 12 的班级)
  • PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。

2、路径(接口命名)

路径又称"终点"(endpoint),表示 API 的具体网址。实际开发中常见的规范如下:

  1. 网址中不能有动词,只能有名词,API 中的名词也应该使用复数。 因为 REST 中的资源往往和数据库中的表对应,而数据库中的表都是同种记录的"集合"(collection)。如果 API 调用并不涉及资源(如计算,翻译等操作)的话,可以用动词。 比如:GET /calculate?param1=11&param2=33
  2. 不用大写字母,建议用中杠 - 不用下杠 _ 比如邀请码写成invitation-code而不是 invitation_code

Talk is cheap!来举个实际的例子来说明一下吧!现在有这样一个 API 提供班级(class)的信息,还包括班级中的学生和教师的信息,则它的路径应该设计成下面这样。

接口尽量使用名词,禁止使用动词。 下面是一些例子:

GET    /classes:列出所有班级POST   /classes:新建一个班级GET    /classes/classId:获取某个指定班级的信息PUT    /classes/classId:更新某个指定班级的信息(一般倾向整体更新)PATCH  /classes/classId:更新某个指定班级的信息(一般倾向部分更新)DELETE /classes/classId:删除某个班级GET    /classes/classId/teachers:列出某个指定班级的所有老师的信息GET    /classes/classId/students:列出某个指定班级的所有学生的信息DELETE classes/classId/teachers/ID:删除某个指定班级下的指定的老师的信息

反例:

/getAllclasses/createNewclass/deleteAllActiveclasses

理清资源的层次结构,比如业务针对的范围是学校,那么学校会是一级资源:/schools,老师: /schools/teachers,学生:/schools/students 就是二级资源。

3、过滤信息(Filtering)

如果我们在查询的时候需要添加特定条件的话,建议使用 url 参数的形式。比如我们要查询 state 状态为 active 并且 name 为 guidegege 的班级:

GET    /classes?state=active&name=guidegege

比如我们要实现分页查询:

GET    /classes?page=1&size=10 //指定第1页,每页10个数据

4、状态码(Status Codes)

状态码范围:

三 HATEOAS

RESTful 的极致是 hateoas ,但是这个基本不会在实际项目中用到。

上面是 RESTful API 最基本的东西,也是我们平时开发过程中最容易实践到的。实际上,RESTful API 最好做到 Hypermedia,即返回结果中提供链接,连向其他 API 方法,使得用户不查文档,也知道下一步应该做什么。

比如,当用户向 api.example.com 的根目录发出请求,会得到这样一个文档。

{"link": {  "rel":   "collection https://www.example.com/classes",  "href":  "https://api.example.com/classes",  "title": "List of classes",  "type":  "application/vnd.yourformat+json"}}

上面代码表示,文档中有一个 link 属性,用户读取这个属性就知道下一步该调用什么 API 了。rel 表示这个 API 与当前网址的关系(collection 关系,并给出该 collection 的网址),href 表示 API 的路径,title 表示 API 的标题,type 表示返回类型 Hypermedia API 的设计被称为HATEOAS。

在 Spring 中有一个叫做 HATEOAS 的 API 库,通过它我们可以更轻松的创建除符合 HATEOAS 设计的 API。

原文:https://mp.weixin.qq.com/s/b9T7J4s7jUFwF_ZKnZ9vKQ

put url带参数_避免自己写的 url 被diss!建议看看这篇RESTful API简明教程!相关推荐

  1. 页面url带参数_微信小程序云开发教程微信小程序的JS高级页面间数据传递

    同学们大家好,我是小伊同学,上一节课我们讲解了全局数据的读写方法,那么在页面间同样需要数据交互,今天我们就来学习这部分内容. 在微信小程序中,我们常常需要将数据在页面之间进行传递,比如用户的身份信息, ...

  2. put url带参数_一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?...

    来源:http://rrd.me/ekN8q 何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算 ...

  3. put url带参数_问题回答:Http 请求的Post 和Put 的区别

    这是在我们的测试进阶社群的微信讨论群里有人讨论的一个面试题: Http 请求的 post 和 put的区别是什么? 很快有人回答"put请求单个数据",后面提问人又去网上查了资料, ...

  4. put url带参数_Superlurl 一款开源关键词URL采集工具

    superl-url是一款开源的,并且功能强大的关键词URL采集工具,可以根据关键词,对搜索引擎内容检索结果的网址内容进行采集.可自动从搜索引擎采集相关网站的真实地址与标题等信息,可保存为文件,自动去 ...

  5. php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程

    php动态添加url查询参数的方法,php动态url参数 本文实例讲述了php动态添加url查询参数的方法.分享给大家供大家参考.具体分析如下: 这段代码可以动态为url添加key-value查询参数 ...

  6. url没有参数名怎么直接带参数_用30行Python爬虫带你看PLMM(划掉,喵星人)

    偶尔写写爬虫也算是打磨无聊生活的一种方式了. 之前写了一个用100多行Python爬虫看世界的帖子,有兴趣的朋友可以看一下. 带你用100多行Python爬虫看看今天的世界(上) 带你用100多行Py ...

  7. Javascript JS 网页分享到QQ空间QQ,java实现qq分享,url带参数的方法

    网页js实现qq分享 创建一个jsp页面,html页面也行,下面是简单demo代码,直接复制到就能用 html把头 <%@ page language="java" cont ...

  8. delve 调试带参数_带你学够浪:Go语言基础系列-环境配置和 Hello world

    前面几周陆陆续续写了一些后端技术的文章,包括数据库.微服务.内存管理等等,我比较倾向于成体系的学习,所以数据库和微服务还有后续系列文章补充. 最近工作上比较多的 Golang 编程,现在很多互联网公司 ...

  9. 字符串url获取参数_如何从URL查询字符串获取示例参数或将其附加到URL查询字符串(示例)?...

    字符串url获取参数 让我们剖析几个简单的用例,并查看视图参数的工作原理(视图参数名称不是强制性的,以匹配通过URL查询字符串传递的请求参数,但在本文中,我们将重点讨论这种情况): 情况1 在inde ...

最新文章

  1. SAP QA32 做使用决策系统报错:分类数据的不一致性=交易终止
  2. ThinkPHP第二十三天(Category表结构、PHPExcel导入数据函数)
  3. Xamarin Visual Studio提示找不到AssemblyAttributes.cs文件
  4. opencv 人脸检测
  5. MySQL 覆盖索引
  6. ICLR 2020 开源论文 | 多关系图神经网络CompGCN
  7. celery无密码连接redis与带密码连接redis
  8. Gartner最新数据报告 WP系统仅剩1%
  9. 一个效果很好的outlookbar控件CXTOutBarCtrl
  10. Ubuntu升级php7.0配置fpm socket
  11. IE8 SVG Viewer下一些对象属性和方法
  12. 浙江大学计算机专业选考要求,浙大等招办主任解读2020年选考科目要求!各专业有调整!...
  13. 读研2年,我选择从中科院退学转行写代码
  14. Go语言学习之net包(The way to go)
  15. 无延时直播/超低延时直播画面同步性测试(实测组图)
  16. redmi ax6s刷机体验和救砖
  17. 深度学习(一)深度前馈网络(deep feedforward network)
  18. 单片机采集交流电流/
  19. CF698A - Vacations
  20. SDRAM控制器操作时序

热门文章

  1. UI线程和Windows消息队列
  2. PHP无用图片清理,php – 如何在img / p /上删除Prestashop无用的图像
  3. 计算机组成原理,P函数,深入浅出计算机组成原理学习笔记:第五讲
  4. 树莓派删除python2.7设置python3.5
  5. kali Linux 基础
  6. OSG与opengl的shader结合
  7. Android开发之播放量点赞量打赏量收藏量单位格式化工具类
  8. java小票_Java编程打印购物小票实现代码
  9. 让线程等待10秒_把python程序变成多线程
  10. Mozilla工程师观点:开源不赚钱,因为它不是为赚钱而设计的