一文搞懂RESTful【亚博app官网】

本文摘要:原创民众号:bigsai 转载请联系bigsai文章收藏在回车课堂前言在学习RESTful 气势派头接口之前,纵然你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景?听完下面形貌我想你就会明确:在互联网并没有完全盛行的初期,移动端也没有那么盛行,页面请求和并发量也不高,那时候人们对接口的要求没那么高,一些动态页面(jsp)就能满足绝大多数的使用需求。

亚博app官网正版下载

原创民众号:bigsai 转载请联系bigsai文章收藏在回车课堂前言在学习RESTful 气势派头接口之前,纵然你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景?听完下面形貌我想你就会明确:在互联网并没有完全盛行的初期,移动端也没有那么盛行,页面请求和并发量也不高,那时候人们对接口的要求没那么高,一些动态页面(jsp)就能满足绝大多数的使用需求。可是随着互联网和移动设备的生长,人们对Web应用的使用需求也增加,传统的动态页面由于低效率而徐徐被HTML+JavaScript(Ajax)的前后端分散所取代,而且安卓、IOS、小法式等形式客户端层出不穷,客户端的种类泛起多元化,而客户端和服务端就需要接口举行通信,但接口的规范性就又成了一个问题:所以一套结构清晰、切合尺度、易于明白、扩展利便让大部门人都能够明白接受的接口气势派头就显得越来越重要,而RESTful气势派头的接口(RESTful API)恰好有以上特点,就逐渐被实践应用而变得盛行起来。现在,RESTful是现在最盛行的接口设计规范,在许多公司有着广泛的应用,其中Github 的API设计就是很尺度的RESTful API,你可以参考学习。

在开发实践中我们许多人可能还是使用传统API举行请求交互,许多人其实并不特别相识RESTful API,对RESTful API的认知可能会停留在:面向资源类型的是一种气势派头(误区)接口通报参数使用斜杠(/)支解而不用问号(?)传参。而其实一个很大的误区不要认为没有查询字符串就是RESTful API,也不要认为用了查询字符串就不是RESTful API,更不要认为用了JSON传输的API就是RESTful API。本教程将带你相识RESTful并用SpringBoot实战RESTful API,在实现本案例前,你需要保证你的电脑上拥有IDEA用来编写项目代码拥有Postman模拟请求举行测试拥有关系数据库MySQL 5.7拥有navicat对MySQL举行治理一、REST先容REST涉及一些观点性的工具可能比力多,在实战RESTful API之前,要对REST相关的知识有个系统的认知。

REST的降生REST(英文:Representational State Transfer,简称REST,直译过来体现层状态转换)是一种软件架构气势派头、设计气势派头,而不是尺度,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个气势派头设计的软件可以更简练,更有条理,更易于实现缓存等机制。它首次泛起在 2000 年 Roy Thomas Fielding 的博士论文中,这篇论文界说并详细先容了表述性状态转移(Representational State Transfer,REST)的架构气势派头,而且形貌了 如何使用 REST 来指导现代 Web 架构的设计和开发。

用他自己的原话说:我写这篇文章的目的是:在切合架构原理前提下,明白和评估基于网络的应用软件的架构设计,获得一个功效强、性能好、适宜通信的架构。需要注意的是REST并没有一个明确的尺度,而更像是一种设计的气势派头,满足这种设计气势派头的法式或接口我们称之为RESTful(从单词字面来看就是一个形容词)。所以RESTful API 就是满足REST架构气势派头的接口。Fielding博士其时提出的是REST架构在良久的时间内并没有被关注太多,而近些年REST在海内才变得越来越盛行。

下面开始详细学习REST架构特征。REST架构特征既然知道REST和RESTful的联系和区别,现在就要开始好好相识RESTful的一些约束条件和规则,RESTful是一种气势派头而不是尺度,而这个气势派头大致有以下几个主要特征:以资源为基础 :资源可以是一个图片、音乐、一个XML花样、HTML花样或者JSON花样等网络上的一个实体,除了一些二进制的资源外普通的文本资源更多以JSON为载体、面向用户的一组数据(通常从数据库中查询而获得)。统一接口: 对资源的操作包罗获取、建立、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。

换言而知,使用RESTful气势派头的接口但从接口上你可能只能定位其资源,可是无法知晓它详细举行了什么操作,需要详细相识其发生了什么操作行动要从其HTTP请求方法类型上举行判断。详细的HTTP方法和方法寄义如下:GET(SELECT):从服务器取出资源(一项或多项)。

POST(CREATE):在服务器新建一个资源。PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。

DELETE(DELETE):从服务器删除资源。固然也有许多在详细使用的时候使用PUT表现更新。从请求的流程来看,RESTful API和传统API大致架构如下:URI指向资源:URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。URI包罗URL和URN,在这里更多时候可能代指URL(统一资源定位符)。

RESTful是面向资源的,每种资源可能由一个或多个URI对应,但一个URI只指向一种资源。无状态:服务器不能生存客户端的信息, 每一次从客户端发送的请求中,要包罗所有必须的状态信息,会话信息由客户端生存, 服务器端凭据这些状态信息来处置惩罚请求。当客户端可以切换到一个新状态的时候发送请求信息, 当一个或者多个请求被发送之后, 客户端就处于一个状态变迁历程中。

每一个应用的状态形貌可以被客户端用来初始化下一次的状态变迁。REST架构限制条件Fielding在论文中提出REST架构的6个限制条件,也可称为RESTful 6大原则, 尺度的REST约束应满足以下6个原则:客户端-服务端(Client-Server): 这个更专注客户端和服务端的分散,服务端独立可更好服务于前端、安卓、IOS等客户端设备。无状态(Stateless):服务端不生存客户端状态,客户端生存状态信息每次请求携带状态信息。

可缓存性(Cacheability) :服务端需回复是否可以缓存以让客户端甄别是否缓存提高效率。统一接口(Uniform Interface):通过一定原则设计接口降低耦合,简化系统架构,这是RESTful设计的基本出发点。

固然这个内容除了上述特点提到部门详细内容比力多详细相识可以参考这篇REST论文内容。分层系统(Layered System):客户端无法直接知道毗连的到终端还是中间设备,分层允许你灵活的部署服务端项目。按需代码(Code-On-Demand,可选):按需代码允许我们灵活的发送一些看似特殊的代码给客户端例如JavaScript代码。

REST架构的一些气势派头和限制条件就先先容到这里,后面就对RESTful气势派头API详细先容。二、RESTful API设计规范既然相识了RESTful的一些规则和特性,那么详细该怎么去设计一个RESTful API呢?要从URL路径、HTTP请求动词、状态码和返回效果等方面详细思量。

至于其他的方面例如错误处置惩罚、过滤信息等规范这里就不详细先容了。URL设计规范URL为统一资源定位器 ,接口属于服务端资源,首先要通过URL这个定位到资源才气去会见,而通常一个完整的URL组成由以下几个部门组成:URI=scheme"://"host":"port"/"path["?"query]["#"fragment]scheme: 指底层用的协议,如http、https、ftphost: 服务器的IP地址或者域名port: 端口,http默认为80端口path: 会见资源的路径,就是种种web 框架中界说的route路由query: 查询字符串,为发送给服务器的参数,在这里更多发送数据分页、排序等参数。

fragment: 锚点,定位到页面的资源我们在设计API时URL的path是需要认真思量的,而RESTful对path的设计做了一些规范,通常一个RESTful API的path组成如下:/{version}/{resources}/{resource_id}version:API版本号,有些版本号放置在头信息中也可以,通过控制版本号有利于应用迭代。resources:资源,RESTful API推荐用小写英文单词的复数形式。resource_id:资源的id,会见或操作该资源。固然,有时候可能资源级别较大,其下还可细分许多子资源也可以灵活设计URL的path,例如:/{version}/{resources}/{resource_id}/{subresources}/{subresource_id}此外,有时可能增删改查无法满足业务要求,可以在URL末尾加上action,例如/{version}/{resources}/{resource_id}/action其中action就是对资源的操作。

从大要样式相识URL路径组成之后,对于RESTful API的URL详细设计的规范如下:不用大写字母,所有单词使用英文且小写。连字符用中杠"-"而不用下杠"_"正确使用 "/"表现层级关系,URL的层级不要过深,而且越靠前的层级应该相对越稳定末端不要包罗正斜杠分开符"/"URL中不泛起动词,用请求方式表现行动资源表现用复数不要用单数不要使用文件扩展名HTTP动词在RESTful API中,差别的HTTP请求方法有各自的寄义,这里就展示GET,POST,PUT,DELETE几种请求API的设计与寄义分析。针对差别操作,详细的寄义如下:GET/collection:从服务器查询资源的列表(数组)GET/collection/resource:从服务器查询单个资源POST/collection:在服务器建立新的资源PUT/collection/resource:更新服务器资源DELETE/collection/resource:从服务器删除资源在非RESTful气势派头的API中,我们通常使用GET请求和POST请求完成增删改查以及其他操作,查询和删除一般使用GET方式请求,更新和插入一般使用POST请求。从请求方式上无法知道API详细是干嘛的,所有在URL上都市有操作的动词来表现API举行的行动,例如:query,add,update,delete等等。

而RESTful气势派头的API则要求在URL上都以名词的方式泛起,从几种请求方式上就可以看出想要举行的操作,这点与非RESTful气势派头的API形成鲜明对比。在谈及GET,POST,PUT,DELETE的时候,就必须提一下接口的宁静性和幂等性,其中宁静性是指方法不会修改资源状态,即读的为宁静的,写的操作为非宁静的。而幂等性的意思是操作一次和操作多次的最终效果相同,客户端重复挪用也只返回同一个效果。

上述四个HTTP请求方法的宁静性和幂等性如下:状态码和返回数据服务端处置惩罚完成后客户端也可能不知道详细乐成了还是失败了,服务器响应时,包罗状态码和返回数据两个部门。状态码我们首先要正确使用各种状态码来表现该请求的处置惩罚执行效果。状态码主要分为五大类:1xx:相关信息2xx:操作乐成3xx:重定向4xx:客户端错误5xx:服务器错误每一大类有若干小类,状态码的种类比力多,而主要常用状态码枚举在下面:200 OK - [GET]:服务器乐成返回用户请求的数据,该操作是幂等的(Idempotent)。

201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据乐成。202 Accepted - [*]:表现一个请求已经进入后台排队(异步任务)204 NO CONTENT - [DELETE]:用户删除数据乐成。400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有举行新建或修改数据的操作,该操作是幂等的。401 Unauthorized - [*]:表现用户没有权限(令牌、用户名、密码错误)。

403 Forbidden - [*] 表现用户获得授权(与401错误相对),可是会见是被克制的。404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记载,服务器没有举行操作,该操作是幂等的。406 Not Acceptable - [GET]:用户请求的花样不行得(好比用户请求JSON花样,可是只有XML花样)。410 Gone -[GET]:用户请求的资源被永久删除,且不会再获得的。

422 Unprocesable entity - [POST/PUT/PATCH] 当建立一个工具时,发生一个验证错误。500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否乐成。

返回效果针对差别操作,服务器向用户返回数据,而各个团队或公司封装的返回实体类也差别,但都返回JSON花样数据给客户端。第三关 一个RESTful API案例上面讲了RESTful理论知识,下面动手实现一个小案例吧!预备在本案例的实战中,我们会见的RESTful接口都是对数据库真实的操作,新建数据库,建立一个数据库和表(凭据自己喜好)。

选择Maven依赖的时候,只需要勾选其中Spring的Web模块、MySQL驱动以及MyBatis框架。本案例的POJO建立Dog.java实体工具,其详细结构为:packagecom.restfuldemo.pojo;publicclassDog{privateintid;//唯一id标识privateStringname;//名称privateintage;//年事//省略getset}上面建立好了项目,我们就开始构建RESTful气势派头的API。在详细构建RESTful API的时候,需要对种种请求有更细致的认知,固然,本案例在实现种种请求的时候为了演示的便捷并没有完全遵循RESTful API规范,例如版本号等信息这里就不添加了,案例更偏重于使用SpringBoot实现这个接口。本案例实现对dog资源的增删改查,如下是非RESTful 和RESTful接口对比:另外在使用postman举行发送请求的时候,有三种常用的文件类型通报到后端:form-data : 就是form表单中的multipart/form-data,会将表单数据处置惩罚为一条信息,用特定标签符将一条条信息支解开,而这个文件类型通常用来上传二进制文件。

x-www-form-urlencoded:就是application/x-www-form-urlencoded,是form表单默认的encType,form表单会将表单内的数据转换为键值对,这种花样不能上传文件。raw:可以上传任意花样的文本,可以上传Text,JSON,XML等,但现在大部门还是上传JSON花样数据。

当后端需要吸收JSON花样数据处置惩罚的时候,可以接纳这种花样来测试。因为GET请求查询参数在URL上,其他类型请求使用x-www-form-urlencoded方式向后端传值。

GET POST PUT DELETE请求GET请求用来获取资源:GET请求会向数据库发索取数据的请求,从而来获取资源,该请求就像数据库的select操作一样,只是用来查询数据,不会影响资源的内容。无论举行几多次操作,效果都是一样的。而且GET请求会把请求的参数附加在URL后面,可是差别的浏览器对其有差别的巨细长度限制。

在本案例中,我们设计两个GET请求的API。GET /dogs :用来返回dog资源的列表。GET /dogs/{dogid} :用来查询此id的单个dog资源。POST请求用来新增一个资源 : POST请求向服务器发送数据,可是该请求会改变数据的内容(新添),就像数据库的insert操作一样,会建立新的内容。

且POST请求的请求参数都是请求体中,其巨细是没有限制的。在本案例中,我们设计以下POST请求的API。POST /dogs :服务端新增一个dog资源。PUT请求用来更新资源,PUT请求是向服务器端发送数据的, 与POST请求差别的是,PUT请求偏重于数据的修改 ,就像数据库中update一样,而POST请求偏重于数据的增加。

在本案例中,我们设计以下POST请求的API。PUT /dogs/{dogid} :用来更新此id的单个dog资源。DELETE 请求用来删除资源,DELETE请求用途和它字面意思一致,用来删除资源。

和数据库中delete相对应。在本案例中,我们设计以下DELETE请求的API。

DELETE /dogs/{dogid} :用来删除此id的单个dog资源。对应的Mapper文件为:packagecom.restfuldemo.mapper;importcom.restfuldemo.pojo.Dog;importorg.apache.ibatis.annotations.*;importjava.util.List;@MapperpublicinterfaceDogMapper{@Select("select*fromdog")List<Dog>getAllDog();@Select("select*fromdogwhereid=#{id}")DoggetDogById(@Param("id")intid);@Insert("insertintodog(name,age)values(#{name},#{age})")booleanaddDog(Dogdog);@Update("updatedogsetname=#{name},age=#{age}whereid=#{id}")booleanupdateDog(Dogdog);@Delete("deletefromdogwhereid=#{id}")booleandeleteDogById(intid);}对应controller文件为:packagecom.restfuldemo.controller;importcom.restfuldemo.mapper.DogMapper;importcom.restfuldemo.pojo.Dog;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.Arrays;importjava.util.List;@RestControllerpublicclassTestController{@Autowired(required=false)DogMapperdogMapper;@GetMapping("dogs")publicList<Dog>getDogs(){returndogMapper.getAllDog();}@GetMapping("dogs/{id}")publicDoggetDogById(@PathVariable("id")intid){Dogdog=dogMapper.getDogById(id);returndog;}@PostMapping("dogs")publicbooleanaddDog(Dogdog){returndogMapper.addDog(dog);}@PutMapping("dogs/{id}")publicbooleanupdateDog(@PathVariable("id")intid,@RequestParam("name")Stringname,@RequestParam("age")intage){Dogdog=dogMapper.getDogById(id);dog.setName(name);dog.setAge(age);returndogMapper.updateDog(dog);}@DeleteMapping("dogs/{id}")publicbooleandeleteDog(@PathVariable("id")intid){returndogMapper.deleteDogById(id);}}经由笔者测试一切都是ok的,如果要项目源文件请联系笔者发你哈!总结RESTful气势派头的API 虽然很好很规范,但大多数互联网公司并没有根据或者完全根据其规则来设计,因为REST是一种气势派头,而不是一种约束或规则,过于理想的RESTful API 会支付太多的成本。好比RESTful API也有一些缺点好比操作方式繁琐,RESTful API通常凭据GET、POST、PUT、DELETE 来区分操作资源的行动,而HTTP Method 自己不行直接见,是隐藏的,而如果将行动放到URL的path上反而清晰可见,更利于团队的明白和交流。

而且有些浏览器对GET,POST之外的请求支持不太友好,还需要特殊分外的处置惩罚。太过强调资源,而实际业务API可能有种种需求比力庞大,单单使用资源的增删改查可能并不能有效满足使用需求,强行使用RESTful气势派头API只会增加开举事度和成本。所以,当你或你们的技术团队在设计API的时候,如果使用场景和REST气势派头很匹配,那么你们可以接纳RESTful 气势派头API。可是如果业务需求和RESTful气势派头API不太匹配或者很贫苦,那也可以不用RESTful气势派头API或者可以借鉴一下,究竟无论那种气势派头的API都是为了利便团队开发、协商以及治理,不能墨守陋习。

到这里RESTful API的先容和实战就竣事啦,本篇首先从RESTful的一些特点举行先容,再到SpringBoot实战RESTful API,最后也说了一些RESTful API并不完美的地方,相信睿智的你对RESTful 一定有了很深刻的明白。在以后项目的API设计上定能有所优化。

差别的人对RESTful API可能有着差别的明白,但存在即合理,RESTful API有着其鲜明的优势和特点,现在也是一种API设计的主要选型之一,所以掌握和明白RESTful API还是相当重要的!到这里,谢谢大家的寓目,也希望头条的朋侪们能够给个关注、点赞、和评论转发,究竟原创不易,您的肯定才是我坚持下去的动力!民众号:bigsai 头条号:法式员bigsai。


本文关键词:一文,搞懂,RESTful,亚博app官网正版下载,【,亚博,app,官网,】,原创

本文来源:亚博app官网-www.time-nb.com

0
首页
电话
短信
联系