当前位置: 首页 > 科技观察

避免自己写的Url被diss!推荐看看这篇关于RestFulAPI的简明教程!

时间:2023-03-21 18:30:25 科技观察

RestFulAPI是每个程序员都应该了解和掌握的基础知识。我们在开发过程中设计API时,至少应该满足RestFulAPI最基本的要求(比如接口中尽量使用名词,使用POST请求创建资源,DELETE请求删除资源等.,例子:GET/notes/id:获取指定id的笔记信息)。如果你看过RestFulAPI相关的文章,一般都是比较晦涩的,包括我后面几篇文章中的一些概念性的东西。然而,其实我们平时在开发中使用的RestFulAPI的知识是非常简单易总结的!比如我给你下面这两个url,你是不是马上就知道是干什么用的了!这就是RestFulAPI的强大之处!RestFulAPI让你看到url+http方法就知道url是做什么用的,让你看到http状态码(statuscode)就知道请求的结果。GET/classes:列出所有类POST/classes:创建一个新类下面的内容只是介绍一些我认为关于RestFulAPI的重要内容,欢迎补充。1、重要概念REST是REpresentationalStateTransfer的缩写。这句话的翻译是“表示层的状态转换”。这种认识是很晦涩的。其实REST的全称是ResourceRepresentationalStateTransfer。直白的翻译就是“资源”在网络传输过程中以某种“表达方式”进行“状态转移”。如果还是不能继续看懂,请继续往下看,相信下面的讲解一定会让你明白什么是REST。下面对上面涉及到的概念分别进行解读,加深大家的理解,但其实并不需要了解下面的概念,就可以理解我接下来要介绍的内容。但是,为了更好的和别人谈论“RestFulAPI”,我建议大家还是要了解一下!资源(Resource):我们可以把真实的对象数据称为资源。资源可以是集合或单个实体。例如,我们的类classes代表资源的集合,而特定的class代表单个单独的资源。每个资源都有一个特定的URI(UniformResourceLocator)与之对应。如果我们需要获取这个资源,可以访问这个URI,比如获取具体的类:/class/12。此外,资源还可以包含子资源,如/classs/classId/teachers:列出指定班级所有教师的信息表示(Representational):“Resource”是一个信息实体,可以有多个外观的Manifestations。我们把json、xml、image、txt等“资源”的具体形式称为它的“表现层/形式”。StateTransfer:大家第一眼看到这个词会不会很懵?内心BB:这是什么狗屎?通俗点说,REST中的状态转移更多的是描述了服务器端资源的状态,比如你通过增删改查(通过HTTP动词实现)来引起资源状态的变化。ps:互联网通信协议HTTP协议是无状态协议,所有资源状态都保存在服务器端。基于以上解释,我们总结一下什么是RESTful架构:每个URI代表一个资源;在客户端和服务器之间,传递这种资源的某种形式的表示,例如json、xml、image、txt等;客户端通过特定的HTTP动词,操作服务器端资源,实现“表现层的状态转换”。二、REST接口规范1、ActionGET:请求从服务器获取特定资源。例如:GET/classes(获取所有类)POST:在服务器上创建一个新资源。例如:POST/classes(创建类)PUT:更新服务器上的资源(客户端提供更新后的整个资源)。例如:PUT/classes/12(更新编号为12的类)DELETE:从服务器中删除特定资源。例如:DELETE/classes/12(删除编号为12的类)PATCH:更新服务器上的资源(客户端提供改变的属性,可以看作是局部更新),用的少,这里就不举例了。2.路径(接口命名)路径也称为“端点”(endpoint),表示API的具体URL。实际开发中常见的规范如下:URL中不能有动词,只能有名词,API中的名词也要使用复数形式。因为REST中的资源往往对应着数据库中的表,而数据库中的表都是同类记录的“集合”。如果API调用不涉及资源(如计算、翻译等),可以使用动词。例如:GET/calculate?param1=11?m2=33不要使用大写字母,建议不要使用中间的斜杠-不要使用下斜杠_比如邀请码写成invitation-code而不是invitation_codeTalk很便宜!下面举一个实际的例子来说明吧!现在有这么一个提供班级信息的API,包括班级的学生和老师的信息,所以它的路径应该设计成下面这样。接口尽量使用名词,禁止使用动词。下面是一些例子:GET/classes:列出所有类POST/classes:新建一个类GET/classes/classId:获取指定类的信息PUT/classes/classId:更新指定类的信息(一般倾向于wholeUpdate)PATCH/classs/classId:更新指定班级的信息(一般是部分更新)DELETE/classes/classId:删除一个班级GET/classs/classId/teachers:列出指定班级所有教师的信息GET/classes/classId/students:列出指定班级所有学生的信息DELETEclasss/classId/teachers/ID:删除指定班级下指定教师的信息反例:/getAllclasss/createNewclass/deleteAllActiveclassesclearresources比如if业务范围为学校,则学校为一级资源:/schools,教师:/schools/teachers,学生:/schools/students为二级资源。3.过滤信息(Filtering)如果我们在查询的时候需要添加特定的条件,建议使用url参数的形式。比如我们要查询state为active且name为guidegege的类:GET/classes?state=active&name=guidegege比如我们要实现分页查询:GET/classes?page=1&size=10//指定第一页,每页10个4.状态码(StatusCodes)3.HATEOASRestFul的终极是hateoas,但是实际项目中基本不会用到这个。以上就是RESTfulAPI最基本的东西,也是我们平时开发过程中最容易实践的。其实RESTfulAPI最好是实现Hypermedia,即在返回结果中提供其他API方法的链接,让用户不用查看文档就知道下一步该怎么做。例如,当用户向api.example.com的根目录发出请求时,会得到这样一个文件。{"link":{"rel":"collectionhttps://www.example.com/classes","href":"https://api.example.com/classes","title":"Listofclasses","type":"application/vnd.yourformat+json"}}上面的代码表示文档中有一个link属性,用户读到这个属性就知道接下来要调用什么API了。rel表示本API与当前URL的关系(集合关系,并给出集合的URL),href表示API的路径,title表示API的标题,type表示返回类型。HypermediaAPI的设计被称为HATEOAS。Spring中有一个名为HATEOAS的API库,通过它我们可以更方便的创建符合HATEOAS设计的API。