关于restful:2023再谈RESTful-和-GraphQL

前段时间组内搞代码检视,常常能看到一些 “挂着 RESTful 羊头,卖的却是 GraphQL 狗肉”的 API 设计。举个例子,如果后盾有两种资源用户 User 和 群组 Group ,依照RESTful的标准,他们设计以下API端点: # 获取用户列表GET /users# 获取指定用户GET /user/{id}# 创立用户POST /users# 批改用户PUT /user/{id}# 删除用户DELETE /user/{id}# 获取群组列表GET /groups# 获取指定群组GET /group/{id}# 创立群组POST /groups# 批改群组PUT /group/{id}# 遣散群组DELETE /group/{id}咋一看没啥问题,可是到了前面,要实现 “用户退出群组” 和 “用户退出群组” 两个个性时,他们给出的API设计: # 用户退出群组PATCH /group/{id}{ "addMembers": ["userID"]}# 用户退出群组PATCH /group/{id}{ "deleteMembers": ["userID"]}我当场就蚌埠住了,这哪里是 RESTful 格调,这不就是他们老大深痛恶绝的 GraphQL ?眼看我就要当场发飙,有个新手连忙进去圆场,他给出以下API设计: # 用户退出群组PATCH /user/{id}/group/{groupID}# 用户退出群组DELETE /user/{id}/group/{groupID}这个设计看起来是解决方才的问题,但实际上只是自欺欺人。我接着诘问: “管理员邀请用户退出群组” 和 “管理员将用户踢出群组” 要怎么设计呢?那个新手依瓢画葫芦给出以下设计: # 管理员邀请用户退出群组PATCH /group/{id}/user/{userID}# 管理员将用户踢出群组DELETE /group/{id}/user/{userID}眼看他们还不觉悟,我就接着诘问:“用户退出群组须要管理员批准” 和 “管理员邀请用户退出群组须要用户批准” 又怎么实现呢?这下子新手也没辙,只能说这块的代码须要从新设计。 我让他们把原来的设计文档从新拿进去检视,而后发现很多中央都不符合规范,连根本的实体关系图ER都没有!我忍不住吐槽:怪不得当年我一个人拿着不到一半的工资,连前后端一起搞,效率却比这帮985/211的高材生/海归还要高,而他们连一个最根本的CURD都要一直地返工! ...

April 10, 2023 · 1 min · jiezi

关于restful:开源API网关APINTOIP黑白名单

公司要求配置IP黑白名单,看了一下Apinto官网介绍,服务治理的拜访策略可配置IP黑白名单。废话不多说,间接上演示。Apinto拜访策略原理:配置筛选条件,用来筛选出符合条件的API申请,即筛选流量,依照配置拜访规定执行容许拜访或回绝拜访失效范畴。配置前置条件,用一个IP为192.168.160.1只能申请的门路是/api/test这个接口,申请其余门路的API报错,不容许拜访。 新建拜访策略筛选条件,属性名称选IP,那么属性值能够是单个IP,也能够是一组IP,把这样的IP浏览筛选进去。当拜访规定配置的是容许时,则这一组IP能够拜访失效范畴的条件,不是这一组IP的申请将不会容许放行。 下面动图中,把一个IP为192.168.160.1的流量筛选进去,容许拜访申请的门路是/api/test这个接口,其余门路的接口是不会被容许拜访的。 公布拜访策略测试后果通过测试后果,咱们能够看到,拜访 /api/test 时会返回响应后果。然而,当拜访 /api/test1 或 /api/test2 时,会失去拜访 {IP} 的申请被回绝的提醒。 总结:当配置的策略筛选条件是一组IP,拜访规定是容许时,且失效范畴不增加任何条件,则这组IP在网关层面是IP白名单,反之亦然。总之这个拜访策略性能切实是太强大了,精准筛选流量执行容许或回绝的失效范畴。好货色必须关注,好了,省得大家去搜,间接提供github地址。 开源地址:https://github.com/eolinker/apinto

March 26, 2023 · 1 min · jiezi

关于restful:RESTful-API-为何成为顶流-API-架构风格

作者孙毅,API7.ai 技术工程师,Apache APISIX Committer万物互联的世界充斥着各式各样的 API ,如何兼顾标准 API 至关重要。RESTful API 是目前世界上最风行的 API 架构格调之一,它能够帮忙你实现客户端与服务端关注点拆散,让前后端各自迭代,晋升管理效率;其无状态的个性能够让利用更容易扩大,更容易的实现缓存策略从而晋升零碎性能和用户体验。本文将介绍什么是 RESTful API 以及咱们如何应用它。 首先,抛开 API 这个概念,咱们来聊聊在生活中如何传递信息。 当你在商店将钱拿给老板通知他你须要买电池,老板在收到钱后在货架上找到电池并递给你。一个买电池的交易顺利完成。 计算机软件则通过 API 来实现信息的传递,先来看维基百科定义: An application programming interface (API) is a way for two or more computer programs to communicate with each other. It is a type of software interface, offering a service to other pieces of software.软件 A 通过 API 向软件 B 发动申请,软件 B 在查问本人资源后将申请的响应内容通过 API 返回 A。 软件 A 通过 API 向软件 B 发动申请就好比你跟老板说你须要电池,软件 B 在将数据返回给软件 A 就好比老板找到电池后将电池给你。 ...

February 10, 2023 · 3 min · jiezi

关于restful:独立产品灵感周刊-DecoHack-035-YouTube-设计改版了

本周刊记录乏味好玩的独立产品设计开发相干内容,每周公布,往期内容同样精彩,感兴趣的搭档能够点击订阅我的周刊。为保障每期都能收到,倡议邮件订阅。欢送通过 Twitter 私信举荐或投稿。1. Darkmodes - 这个网站收集了很多暗黑模式做的很好的网站。 webroll - 这个网站能够随机去一个独特乏味的网站。之前周刊也举荐过几个。Radio.garden - 这个网站能够听到全世界各地的电台,这是我发现做的最好的一个电台网站了,很全。就跟玩 google earth 一样轻易找找,还有另外一个 internet-radio 也能够找到一些。fReddit - 这个网站依据你的抉择举荐一些 Reddit 板块,比官网的更直观一点。Reddit 下面还是有十分多有意思的内容的。找找喜爱的板块去看看。Sirin Audiobook Player - 这是一个有声书本地播放器,当初还是有很多人有这个需要的,这个软件是一个很洁净的工具,反对播放很多种音频格式,反对下载种子文件,还能够剖析有声读物的章节和封面。内购产品,也很适宜独立开发者来做,也算是比拟小众。threadvideos - 这个产品想法很不错,能够用来把 Reddit 或者 Twitter 的帖子内容制作成视频,用来公布到 TikTok, YouTube, Facebook, Instagram 这些平台。是一个很有用的小工具。不错的独立开发我的项目。当初还没有上线,能够去官网看看操作介绍。开源我的项目1. cal.com - 开源的日程安排工具,设计的很不错,开源的。11 个让您的网站怀才不遇的导航组件 - 前端的代码片段,能够看看有些挺有创意。轻易看看1. Sam Ruston - 这是 Android 开发者 @Sam_Ruston 的官网,他卡发了很多有意思的 APP,能够去他的 Google Play 主页看看。设计的也挺简洁难看。作者还取得过谷歌的 Material Design award .YouTube 的更新外观设计 - 刚看了一下 YouTube 设计改版了,昨天更新的,界面更好看了,快去看看,手机端和 Web 端都有变动,微光成果看上去很难受。网页变大圆角。更多内容能够订阅我的周刊:竹白订阅|官网|RSS订阅 |Telegram频道|Twitter另外,往期举荐的产品根本没有时效性,感兴趣的搭档能够去看看我整顿的往期产品数据库,能够筛选/分类/标签/搜寻我举荐过的所有软件,更多介绍请看 会员打算。

October 25, 2022 · 1 min · jiezi

关于restful:13个构建RESTful-API的最佳实践

前言Facebook、GitHub、Google和其余许多巨头都须要一种办法来服务和生产数据。在明天的开发环境中,RESTful API依然是服务和生产数据的最佳抉择之一。 但你是否思考过学习行业标准?设计一个RESTful API的最佳实际是什么?实践上来说,任何人都能够在5分钟内疾速启动一个数据API。无论是Node.js、Golang,还是Python。 咱们将摸索构建RESTful API时应该思考的13个最佳实际。 最佳实际本文为你提供了13个可操作的最佳实际清单。让咱们一起来摸索吧! 正确应用HTTP办法咱们曾经探讨了你能够用来批改资源的可能的HTTP办法:GET,POST,PUT,PATCH,和 DELETE。 然而,许多开发者往往会滥用GET和POST,或者PUT和PATCH。通常状况下,咱们看到开发者应用POST申请来检索数据。此外,咱们看到开发者应用PUT申请来替换资源,而他们只想更新该资源的一个字段。 确保应用正确的HTTP办法。如若不如此做,将为应用你的RESTful API的开发者减少许多困惑。最好恪守预约的准则。 命名约定了解RESTful API的命名约定将对你井井有条地设计你的API有很大的帮忙。依据你所服务的资源来设计一个RESTful API。 举例来说,你的API用来治理作者和书籍(没错,十分经典的例子)。当初,咱们想增加一位新作者,或者通过ID3来拜访一位作者。你能够设计以下路由来实现此目标: api.com/addNewAuthorapi.com/getAuthorByID/3设想一下,一个承载了许多资源的API,每个资源都有许多属性。可能的端点列表将变得无穷无尽,而且对用户不是很敌对。所以咱们须要一种更有组织、更标准化的形式来设计API端点。 RESTful API的最佳实际形容了一个端点应该以资源名称开始,而HTTP的操作则形容了行为。当初咱们失去: POST api.com/authorsGET api.com/authors/3如果咱们想拜访ID为3的作者写过的所有书,怎么办?对于这种状况,RESTful API也有一个解决方案: GET api.com/authors/3/books最初,如果想为ID为3的作者删除ID为5的图书,该怎么办呢?同样的,让咱们遵循雷同的结构化办法来造成上面的端点: DELETE api.com/authors/3/books/5简而言之,利用HTTP操作和资源映射的结构化形式,造成一个可读的、可了解的端点门路。这种办法的最大长处是,每个开发者都理解RESTful API是如何设计的,他们能够立刻应用API,而不用浏览你的每个端点的文档。 应用复数资源资源应始终应用其复数模式。为什么?设想一下,你想检索所有的作者。因而,你会调用以下端点:GET api.com/authors 。 当你浏览申请时,你无奈判断API响应将只蕴含一个或所有作者。出于这个起因,API端点应该应用复数资源。 正确应用状态码状态码不仅仅是为了好玩,他们有明确的目标。状态码告诉客户端申请胜利。 最常见的状态码分类包含: 200 (OK):申请已胜利解决并实现。201 (Created):示意资源创立胜利。400 (Bad Request):示意客户端谬误。也就是说,申请格局不正确或短少申请参数。401 (Unauthorized):尝试拜访没有权限的资源。404 (Not Found):申请的资源不存在。500 (Internal Server Error):每当服务器在申请执行过程中引发异样时。状态码的残缺列表能够在MDN上找到。别忘了查看“I’m a teapot”状态码(418)。 遵循大小写约定最常见的是,RESTful API提供JSON数据。因而,应该履行驼峰格局的大小写约定。然而,不同的编程语言应用不同的命名约定。 如何解决搜寻、分页、过滤和排序搜寻、分页、过滤和排序等操作并不代表独自的端点。这些操作能够通过应用与API申请一起提供的查问参数来实现。 比如说,让咱们检索所有依照姓名升序排序的作者。你的API申请看起来应该长这样:api.com/authors?sort=name_asc 。 此外,我想检索名为Michiel的作者。申请看起来长这样:api.com/authors?search=Michiel 。 侥幸的是,许多API我的项目都具备内置的搜寻、分页、过滤和排序功能。这将节俭你大量的工夫。 API版本我并不常常看到这种状况,但这是对API进行版本化的最佳实际。这是向用户传播破坏性更改的无效办法。 通常,API的版本号被纳入API的URL中,比方:api.com/v1/authors/3/books。 通过HTTP头发送元数据HTTP头容许客户在其申请中发送额定的信息。例如,Authorization头部通常用于发送认证数据以拜访API。 所有可能的HTTP头的残缺列表能够在这里找到。 速率限度速率限度是一种乏味的办法,能够管制每个客户端的申请数量。上面这些是你的服务器能够返回的可能的速率限度头部: X-Rate-Limit-Limit:通知客户端在指定的工夫距离内能够发送的申请数量。X-Rate-Limit-Remaining:通知客户端在以后工夫距离内还能发送多少个申请。X-Rate-Limit-Reset:通知客户端何时重置速率限度。有意义的错误处理万一出了问题,向开发者提供一个有意义的错误信息是很重要的。比如说,Twilio的API返回以下谬误格局: { "status": 400, "message": "Resource books does not exist", "code": 24801, "more_info": "api.com/docs/errors/24801"}在这个例子中,服务器返回状态码和一个人类可读的信息。此外,还返回了一个外部错误代码,以便开发人员查找具体的谬误。这容许开发人员疾速查找无关该谬误的更多信息。 ...

September 28, 2022 · 1 min · jiezi

关于restful:什么是REST-API

前言什么是REST API?REST是Representational State Transfer(体现层状态转移)的缩写 - 对最罕用的网络服务技术简直是毫无意义的形容。REST API是两个计算机系统在web浏览器和服务器中应用HTTP技术进行通信的一种形式。在两个或多个零碎之间共享数据始终是软件开发的一个根本要求。比如说,思考购买汽车保险。你的保险公司必须取得对于你和你的车辆的信息,所以他们要求从汽车注销机构、信贷机构、银行和其余零碎取得数据。所有这些都是实时通明地产生的,以确定保险公司是否能提供一个有竞争力的保单。 API(利用程序接口)通过为零碎之间的对话提供接口来帮忙这种类型的通信。REST只是一种被宽泛驳回的API格调,咱们用它来与外部和内部以一种统一的和可预测的形式进行沟通。它能够比作咱们以前寄信时用邮票、地址和信封的形式,以确保函件被送达和浏览。 REST是人们在web零碎中罕用的交互方式。例如,在一个社交媒体利用中检索和更新账户信息。 REST API示例在你的浏览器中关上以下链接,从Open Trivia Database中申请一个随机的计算机问题: https://opentdb.com/api.php?amount=1&category=18 这是一个作为RESTful网络服务实现的公共API(它遵循REST公约)。你的浏览器将展现一个独自的JSON格局的问答问题,并附有答案。比如说: { "response_code": 0, "results": [ { "category": "Science: Computers", "type": "multiple", "difficulty": "easy", "question": "What does GHz stand for?", "correct_answer": "Gigahertz", "incorrect_answers": [ "Gigahotz", "Gigahetz", "Gigahatz" ] } ]}你能够应用任意HTTP客户端,来申请同样的URL并失去响应,比方应用curl: curl "https://opentdb.com/api.php?amount=1&category=18"HTTP客户端库能够在所有风行的语言和运行时中应用,包含JavaScript、Node.js和Deno中的Fetch以及PHP中的file_get_contents()。JSON响应是机器可读的,因而能够在输入HTML或其余格局之前被进行解析和应用。 REST APIs和Rest多年来,各种数据通信规范曾经倒退起来。你可能遇到过的抉择包含CORBA,SOAP,或者 XML-RPC。大多数都确定了严格的消息传递规定。 REST是由Roy Fielding在2000年定义的,比其余的要简略得多。它不是一个规范,而是一套对于RESTful网络服务的倡议和束缚。其中包含: 客户服务器拆散模式(Client-Server):零碎A向零碎B托管的URL收回HTTP申请,并返回一个响应。这与浏览器的工作形式雷同。浏览器对一个特定的URL发出请求,该申请被转发到一个web服务器,该服务器通常返回一个HTML页面。该页面可能蕴含对图片、样式表和JavaScript的援用,从而产生进一步的申请和响应。无状态(Stateless):REST是无状态的:客户端申请应该蕴含响应所需的所有信息。换句话说,应该能够依照任何程序收回两个或更多的HTTP申请,并且会收到雷同的响应(除非API被设计为返回随机响应)。可缓存(Cacheable):响应应该被定义为可缓存或不可缓存。缓存能够进步性能,因为没有必要为同一个URL从新生成一个响应。在某个时间段特定于某个用户的私人数据通常不会被缓存。分层(Layered):申请的客户端不须要晓得它是否在与理论的服务器、代理或任何其余中间人进行通信。创立RESTful网络服务一个RESTful网络服务申请包含: 端点URL。实现RESTful API的应用程序将定义一个或多个带有域名、端口、门路、和/或查问字符串的URL端点,例如,https://mydomain/user/123?format=json。HTTP办法。不同的HTTP办法能够在任何端点上应用,这些办法映射到应用程序的创立、读取、更新和删除(CRUD)操作:| HTTP办法 | CRUD | 行为 || --- | --- | --- || GET | 读取 | 返回申请数据 || POST | 创立 | 创立一个新记录 || PUT 或者 PATCH | 更新 | 更新已存在的记录 || DELETE | 删除 | 删除已存在的记录 |比方:- 对`/user/`的GET申请返回零碎中的注册用户列表。- 对`/user/`的POST申请应用`body`对象创立了一个ID为`123`的用户。该响应会返回ID。- 对`/user/123`的PUT申请应用`body`对象更新用户`123`。- 对`/user/123`的GET申请返回用户`123`的详情。- 对`/user/123`的DELETE申请删除用户`123`。HTTP头部。认证令牌或cookies等信息能够蕴含在HTTP申请头中。Body对象。数据通常在HTTP主体中传输,该形式与HTML<form>提交或者发送独自的JSON编码的数据字符串等形式雷同。 ...

September 21, 2022 · 2 min · jiezi

关于restful:RESTful接口的csrf防御考虑

对于RESTful规范服务是否须要办法跨站申请攻打,网上有很多探讨,总结下来外围的关键点在于是否应用了cookie,而就目前而言,REST规范下的服务接口,即使API做到了无状态,用户令牌(Token)也很常常会放到localStorage或者cookie中,这些状况下实质上与RESTful的无状态规范定义不抵触,然而必须要思考XSS(跨站脚本攻打)、CSRF(跨站申请攻打)的防备需要了。 Cookie中有个HttpOnly的属性,如果没有设置为true,应用js脚本能够拿到其中存储的内容,歹意页面可能会通过嵌入代码拿到用户未爱护的cookie值,如果存储的是用户敏感身份信息,并且网站服务没有更多的保护措施,那么黑客便能够伪造用户的身份随心所欲了。localStorage同样存在XSS平安危险,因而不利用来存储敏感数据。 CSRF在用户关上了黑客的歹意页面时产生,通过简略的嵌入<img>标签或者iframe,能在用户无感知的状况下应用用户的cookie数据拜访其余网站的GET、POST接口服务,尽管黑客得不到被爱护cookie中的值,甚至无奈解析响应报文内容,然而接口的随便伪造调用带来的危险微小。因而个别状况下网站服务须要思考csrf的平安防护。 但如果是REST规范的API服务方呢? 在REST规范下,GET办法不会产生数据批改,最多会产生一些额定的日志数据和网络流量,因而对于GET申请无需对csrf布防。而POST办法须要思考其容许的Content-Type,如果仅反对application/json格局,那么嵌入的iframe页面中的form提交产生的form-data或者form-urlencoded申请无奈胜利,而应用XmlHttpRequest发动的post申请,因为浏览器的同源策略,又会要求发动预检(preflight)申请,因而也不可能胜利。而其余Patch、Delete、Put办法的申请,既不能通过iframe达成,也无奈跳过预检申请步骤,因而在仅反对application/json的POST状况下,RESTful接口提供服务方能够不必思考csrf平安防护。 凡事无相对,在网上有一篇通过flash达成对application/json接口进行csrf攻打的办法 : 服务的校验Content-Type,只接管application/json格局的CSRF绕过办法。 不过思考到支流浏览器对flash的反对均已下线,怎么说呢...Otherwise,就不得不思考进攻下csrf攻打了。如果面临这种需要,能够从以下办法着手: 验证申请Referer,对于应用非IE6非hack版本奇葩浏览器的失常用户,拦挡下申请的Referer,只容许受信赖的起源方发动的申请,基本上就是改变最小成果最快的csrf进攻伎俩了。思考下用户token真的须要保留到cookie中吗?如果敞开浏览器就完结会话,下次从新登录能够接管,那就不要写cookie了;如果用户须要主动续签token,要做到无感知主动登录,能够写个refresh_token用来在下次申请时从新续签token(从新生成),这个token数据就存在浏览器内存变量中,而后在后续申请中携带上新的token信息,而不是写到cookie里。otherwise,用csrfToken,用户登录胜利后,或者验证身份胜利后,生成一个随机csrfToken给前端,后续申请时带上这个。csrfToken不必验证身份,只需判断是否是实在签发过的就行,能够简略放到redis汇合数据中。

July 2, 2022 · 1 min · jiezi

关于restful:RESTful接口设计译

原文链接:Web API design best practices - Azure Architecture Center | Microsoft Docs当初网络上曾经有了很多服务商的公开API,能够让各类客户端调用,那么怎么才是一个设计低劣的web API呢?一般来讲应该具备以下规范: 平台无关性:应用API的能够是任何客户端,它们不必关怀API是怎么实现的。这就要求了交互时应用到的协定要标准化,并且要存在一种机制,能确保客户端和服务提供方在数据格式上达成统一。服务演变: web API能够自行更新迭代本人的性能,应用它的客户端不必做出任何批改就能持续应用这些API。服务端提供的所有性能要具备可发现性,使得客户端能充沛应用到它们。上面来说说设计web API时要思考的一些关键问题。 什么是REST?在2000年,Roy Fielding提出应用表述性状态转移(Representational State Transfer ,简称REST)来设计网络服务的构建办法。REST是一种基于超媒体来构建分布式系统的架构格调,它不应关注底层服务如何,也不必跟HTTP绑定,不过大部分REST API的实现还是基于了HTTP协定。让咱们先关注下如何应用HTTP来设计REST API接口。 在HTTP上应用REST的益处是它是一个有公开规范的协定,不须要这些API的提供方或应用方依赖任何特定实现计划,服务方和应用方能够用任意语言、工具包来提供REST服务实现,或创立HTTP申请以及解析HTTP响应报文。 基于HTTP设计RESTful API的次要准则有: REST API的外围是资源,能够是客户能拜访到的任意物体、数据或服务每种资源都要有一个举世无双的URI来作为惟一标识符定位到该资源。比方一种客户订单能够这样形容: https://adventure-works.com/orders/1客户通过替换资源表述来与服务交互。许多web API应用JSON作为数据转换格局。例如,一个针对下面URI的GET申请可能失去如下内容: {"orderId":1,"orderValue":99.90,"productId":1,"quantity":1}REST API应用一套对立的接口,来帮忙解耦调用端和服务实现。在HTTP上构建REST API时,对立接口应用规范的HTTP动词来执行资源的操作,常常应用到的操作有GET,POST,PUT,PATCH和DELETE。REST API是无状态的。因为收回的HTTP申请是独立且无序的,因而没方法在申请间放弃这种长期会话状态。能存储信息的中央只能是API资源本身,而每个申请该当是原子操作。这样的束缚要求客户和特定服务器间不能保留任何关联,从而使得服务具备了高度的可伸缩性。任意的服务器能够解决任何的客户申请。然而,其余因素可能会限度这种可伸缩性,比方很多服务都要写数据到后端存储中,而这种繁多存储就很难扩大。对于这种数据存储该如何扩大的策略办法,能够参考Horizontal, vertical, and functional data partitioning.REST API的重要驱动外围是其表述内容中蕴含的超媒体链接。举个例子,上面展现了一个蕴含订单信息的JSON格局内容,它蕴含了一些链接,用来取得或更新与该订单关联的客户数据。 { "orderID":3, "productID":2, "quantity":4, "orderValue":16.60, "links": [ {"rel":"product","href":"https://adventure-works.com/customers/3", "action":"GET" }, {"rel":"product","href":"https://adventure-works.com/customers/3", "action":"PUT" } ]}在2008年,Leonard Richardson提出了一个web API成熟度模型: Level 0:仅有一个URI,用来解决所有POST申请 .Level 1:不同的资源提供独自的URI申请门路.Level 2:应用HTTP的method来定义在资源上的不同操作.Level 3:应用了超媒体(HATEOS,上面会提到) 围绕资源设计APIweb API须要裸露一些业务实体, 拿电商零碎来举例,次要的实体基本上就是客户和订单了。能够发送一个蕴含了订单信息的HTTP POST申请来创立一个订单,而响应报文该当告知这个订单是否创立胜利。请记得,提供进去的这些资源操作URI应尽量应用名词(资源名)来形容,而非动词(操作动作)。 https://adventure-works.com/orders // Goodhttps://adventure-works.com/create-order // Avoid一个所谓的资源不肯定要是一个实在的物理实体,比方对于订单来说,它可能在外部实现上用到了数张关系型数据库中的表,然而对于客户而言,它就是一个独自的实体。不要创立一些仅仅是把数据库对象做了个简略镜像展现的API。REST的指标是形容实体和可在其上执行的操作,而客户不应接触到外部实现。 ...

June 22, 2022 · 4 min · jiezi

关于restful:RESTful-API-参数限制

API 查看参数常见 API创立新的学生材料的接口如下: Request POST /students HTTP/1.1Host www.school.comContent-Type application/json{ "name": "tom", "age": 12, "ethnicity": "HAN"}Response HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8{ "code": 0, "message": "success", "data": { "id": 1, "name": "tom", "age": 12, "ethnicity": "HAN" }}蕴含 name \ age \ ethnicity 三个参数,其中 ethnicity 民族,须要做查看以防止输出零碎无奈解决的内容。 例如,前端须要将民族本地化为中文,零碎不反对的民族就无奈本地化为中文。如果只有中国的 56 个民族,应用常量或者枚举都能够,实际中个别会选着应用枚举: public enum Ethnicitiy { //汉族 HAN, //蒙古族 MONGOL, // ... //基诺族 JINO;}枚举中没有设置字段存储中文含意,是为了将编码和本地化解耦。如果只有繁多语言需要,请随便Spring Web 模块默认反对枚举反序列化,谬误的数据将导致反序列化失败,这样就达到了查看参数的目标 数据耦合这样的形式能实现性能,然而会使得数据和代码耦合。例如,须要新增一个 其余 other 选项,就须要更新代码并公布新版本 很多时候还会在前端存在相似的问题。例如,后端定义了枚举之后,APP 为了本地化显示会在代码中耦合相似枚举的数据。减少新的 其余 other 选项之后,后端和 APP 都须要公布新版本,然而 APP 是否降级是由用户抉择的,如果抉择强制降级会重大影响用户体验。 ...

June 13, 2022 · 2 min · jiezi

关于restful:吐槽一下-REFTFul-API-实践中的问题

当年初生牛犊不怕虎机翻了如何设计RESTful API?,妄图在实践中用起来,在每一个禁受的我的项目中都想实现,每一次都被打脸,工夫久了就放弃医治了。接下来埋怨一些过程中遇到的坑吧。 HTTP 实现 RESTFul API 一共就3件事件,怎么就这么难呢? 看 url 就晓得操作什么看 http method 就晓得干什么看 http status code 就晓得后果难以定义 URL资源的定义就很难,教程里的案例都是很简略的状况,现实情况简单得多。例如,当初有一个需要,一个客户端 A 须要一个用户分页接口,查问条件有姓名、电话、注册工夫等。还有一个客户端 B 也须要用户分页接口,然而查问条件有姓名、罕用收货地址等。尽管都是分页查问用户,然而实现的逻辑齐全不同,个别都是离开定义 API 客户端 A 须要的接口: GET /v1/users HTTP/1.1Host: www.demo.comname=tom&phone=123321&sign_time=2011-01-01客户端 B 须要的接口: GET /v1/users/with-common-address HTTP/1.1Host: www.demo.comname=tom&phone=123321&common_address=abc%20efg越是根底数据,越容易遇到多端须要的参数不同,要求返回的数据也不同。特地是遇到实现办法天壤之别的时候,通常都是通过加后缀或者前缀的形式辨别。 然而这个例子是能够用一个接口实现的,程序上是能够通过是否蕴含 commons_address 参数辨别不同的解决逻辑。然而这里有个很事实的问题,如果第一个接口曾经存在并且工作良好的话,作为承受第二个接口开发的你,有勇气去批改第一个接口的实现吗?特地是在逻辑很简单,第一个接口的代码可读性不高的时候。 除了以上的问题,当相似的需要过多时,这个接口的参数将越来越多,返回的音讯构造蕴含的字段也越来越多。参数该怎么传,什么状况下哪些参数不能传。返回音讯体每个字段什么时候会有值,什么时候没有值。这些都须要在逻辑里实现,并且测试,最初还得同步到 API 文档中。这样的代码难以保护,接口文档难以浏览。 临时没有找到比加后缀老本更低的形式,或者能够思考加一个中间层,毕竟 计算机领域的任何问题都能够通过减少一个间接的中间层来解决 被弃用的状态码应用服务器通常只返回 200、401、500 错误码,其中 401 通常还是由权限框架实现的。更常见的是自定义 code 示意谬误起因,如果没有国际化需要的话,大概率这个 code 只有两个值,一个示意胜利,一个示意业务逻辑谬误。就像上面的例子: HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8{ "code": 123321, "message": "手机号曾经被占用"}实质的起因还是大部分业务逻辑上的谬误,不须要非凡解决只须要提醒就行。所以只须要辨别: 胜利 http 200, code 0业务逻辑谬误 http 200, code 不等于 0代码谬误 http 500而且不同 HTTP 状态码,须要编码实现如何解决,然而实现的成果都是把应用服务器返回的音讯提醒一下而已。这里的坑在于提示信息是硬编码在应用服务器的代码中,如果想改一下提示信息就得公布代码。 ...

May 30, 2022 · 1 min · jiezi

关于restful:RESTful和SOAP的区别

一、Web Service Web Service服务通常被定义为一组模块化的API,它们能够通过网络进行调用,来执行近程零碎的申请服务。Web service是一个平台独立的,低耦合的,自蕴含的、基于可编程的web的应用程序,可应用凋谢的XML规范来形容、公布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。各应用程序通过网络协议和规定的一些规范数据格式(Http,XML,Soap)来拜访Web Service,通过Web Service外部执行失去所需后果。根据Web Service标准施行的利用之间, 无论它们所应用的语言、 平台或外部协定是什么, 都能够相互交换数据。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。 实际上,Web Service的次要指标是跨平台的可互操作性。为了达到这一指标,Web Service齐全基于XML(可扩大标记语言)、XSD(XMLSchema)等独立于平台、独立于软件供应商的规范,是创立可互操作的、分布式应用程序的新平台。Web service平台必须提供一套规范的类型零碎,用于沟通不同平台、编程语言和组件模型中的不同类型零碎。 根本元素 Web Service的三种根本元素:SOAP、WSDL和UDDI。 SOAP 是一种基于XML协定、用于扩散或散布的环境中替换信息的简略协定。 WSDL ( 网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于形容 Web Services 以及如何对它们进行拜访。web service 描述语言 (WSDL) 就是这样一个基于 XML 的语言,用于形容 web service 及其函数、参数和返回值。因为是基于 XML 的,既可供人浏览,也可应用工具生成调用相应 web service 的代码。实例如下: <?xml version="1.0" encoding="UTF-8" ?><definitions targetNamespace="http://schemas.xmlsoap.org/HelloService" xmlns:tns="http://schemas.xmlsoap.org/HelloService" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <!-- (参数类型) 数据类型定义,个别应用XML Schema中的类型零碎 --><types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.xmlsoap.org/HelloService" attributeFormDefault="qualified" elementFormDefault="qualified" > <xsd:element name="sayHello"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string" /> </xsd:sequence></xsd:complexType></xsd:element> <xsd:element name="sayHelloResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string" /> </xsd:sequence></xsd:complexType></xsd:element> </xsd:schema></types><!-- (操作中的参数) 应用Types所定义的类型来定义整个音讯的数据结构 --><message name="sayHelloRequest"> <part name="parameters" element="tns:sayHello" /></message><message name="sayHelloResponse"> <part name="parameters" element="tns:sayHelloResponse" /></message><!-- (提供的操作) portType形容了一组操作 --><portType name="HelloServicePortType"> <operation name="sayHello"> <input name="sayHelloRequest" message="tns:sayHelloRequest" /> <output name="sayHelloResponse" message="tns:sayHelloResponse" /> </operation></portType><!-- (绑定通信协议)形容如何将portType映射成传输/消息传递协定,binding将portType绑定到特定的协定(例如 SOAP、HTTP或MIME)--><binding name="HelloServicePortBinding" type="tns:HelloServicePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="sayHello"> <!-- 元素的soapAction属性被转换成HTTP头 --> <soap:operation soapAction="" /> <input name="sayHelloRequest"> <soap:body use="literal" /> </input> <output name="sayHelloResponse"> <soap:body use="literal" /> </output> </operation></binding><!-- (有特定操作的服务)service列出某个特定绑定的连贯信息。服务能够有一个或多个端口,每个端口都定义一个不同的连贯办法(例如HTTP/SMTP等等) --><service name="HelloService"> <port name="HelloServiceHttpPort" binding="tns:HelloServicePortBinding"> <soap:address location="http://localhost:8080/services/HelloService" /> </port></service></definitions>View Code UDDI ( 通用形容、发现与集成服务,Universal Description, Discovery and Integration) UDDI 是一种目录服务,企业能够应用它对 Web services 进行注册和搜寻。UDDI 是一种由 WSDL 形容的 ,用于存储无关 web services 的信息的目录,应用 SOAP、XML、HTTP 和 DNS 协定。UDDI是一种标准,它次要提供基于Web服务的注册和发现机制,为Web服务提供三个重要的技术支持:①规范、通明、专门形容Web服务的机制;②调用Web服务的机制;③能够拜访的Web服务注册核心。 ...

April 23, 2022 · 2 min · jiezi

关于restful:RestfulSOAPRPCSOA微服务之间的区别

什么是RestfulRestful是一种架构设计格调,提供了设计准则和约束条件,而不是架构,而满足这些约束条件和准则的应用程序或设计就是 Restful架构或服务。次要的设计准则: 资源与URI 对立资源接口(HTTP办法如GET,PUT和POST) 资源的表述 资源的链接 状态的转移总之,RESTful的外围就是后端将资源公布为URI,前端通过URI拜访资源,并通过HTTP动词示意要对资源进行的操作。什么是SOAP简略对象拜访协定是一种数据交换协定标准,是一种轻量的、简略的、基于XML的协定的标准。SOAP协定和HTTP协定一样,都是底层的通信协议,只是申请包的格局不同而已,SOAP包是XML格局的。SOAP的音讯是基于xml并封装成了合乎http协定,因而,它合乎任何路由器、 防火墙或代理服务器的要求。SOAP能够应用任何语言来实现,只有发送正确的soap申请即可,基于soap的服务能够在任何平台无需批改即可失常应用。RPCRPC 的全称是 Remote Procedure Call 是一种过程间通信形式。它容许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不必程序员显式编码这个近程调用的细节。即无论是调用本地接口/服务的还是近程的接口/服务,实质上编写的调用代码基本相同。比方两台服务器A,B,一个利用部署在A服务器上,想要调用B服务器上利用提供的函数或者办法,因为不在一个内存空间,不能间接调用,这时候须要通过就能够利用RPC框架的实现来解决 RPC就是从一台机器(客户端)上通过参数传递的形式调用另一台机器(服务器)上的一个函数或办法(能够统称为服务)并失去返回的后果。RPC 会暗藏底层的通信细节(不须要间接解决Socket通信或Http通信)RPC 是一个申请响应模型。客户端发动申请,服务器返回响应(相似于Http的工作形式)RPC 在应用模式上像调用本地函数(或办法)一样去调用近程的函数(或办法)。4种典型RPC近程调用框架(1)RMI实现,利用java.rmi包实现,基于Java近程办法协定(Java Remote Method Protocol)和java的原生序列化。(2)Hessian,是一个轻量级的remoting onhttp工具,应用简略的办法提供了RMI的性能。 基于HTTP协定,采纳二进制编解码。(3)thrift是一种可伸缩的跨语言服务的软件框架。thrift容许你定义一个形容文件,形容数据类型和服务接口。根据该文件,编译器不便地生成RPC客户端和服务器通信代码。(4)Dubbo是阿里巴巴公司开源的一个高性能优良的服务框架,使得利用可通过高性能的 RPC 实现服务的输入和输出性能,能够和 Spring框架无缝集成(5)还有SpringCloud框架,微服务全家桶。为开发人员提供了疾速构建分布式系统的一些工具,包含配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。微服务在实质上,就是rpc。rpc有基于tcp的,http的,mq的等等。spring cloud是基于spring boot的,spring boot 实现的是http协定的rpc,算是rpc的一个子集。什么是SOASOA(Service-Oriented Architecture),中文全称:面向服务的架构。艰深点来讲,SOA提倡将不同应用程序的业务性能封装成“服务”并宿主起来,通常以接口和契约的模式裸露并提供给外界利用拜访(通过替换音讯),达到不同零碎可重用的目标。SOA是一个组件模型,它能将不同的服务通过定义良好的接口和契约分割起来。服务是SOA的基石。 业务零碎合成为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力通过服务的组合和编排来实现下层的业务流程作用:简化保护,升高整体危险,伸缩灵便 微服务架构什么是微服务架构架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它个性(繁多职责,边界,异步通信,独立部署)是分布式概念作用:各服务可独立利用,组合服务也可零碎利用(巨石利用[monolith]的简化实现策略-平台思维) 微服务和SOA的区别微服务是SOA架构演进的后果。两者说到底都是对外提供接口的一种架构设计形式,随着互联网的倒退,简单的平台、业务的呈现,导致SOA架构向更细粒度、更通过化水平倒退,就成了所谓的微服务了。总之,微服务是SOA倒退进去的产物,它是一种比拟现代化的细粒度的SOA实现形式。SOA与微服务的区别在于如下几个方面: 微服务相比于SOA更加精密,微服务更多的以独立的过程的形式存在,相互之间并无影响; 微服务提供的接口方式更加通用化,例如HTTP RESTful形式,各种终端都能够调用,无关语言、平台限度; 微服务更偏向于分布式去中心化的部署形式,在互联网业务场景下更适宜。 SOA架构次要针对企业级、采纳ESB服务(ESB企业服务总线),十分重,须要序列化和反序列化,采纳XML格局传输。 微服务架构次要互联网公司,轻量级、玲珑,独立运行,基于Http+Rest+JSON格局传输。为什么要应用微服务?技术为业务而生,架构也为业务而呈现,当然SOA和微服务也是因为业务的倒退而呈现。https://www.cnblogs.com/wwct/...平台随着业务的倒退从 All in One 环境就能够满足业务需要(以Java来说,可能只是一两个war包就解决了)。倒退到须要拆分多个利用,并且采纳MVC的形式拆散前后端,放慢开发效率;在倒退到服务越来越多,不得不将一些外围或共用的服务拆分进去,其实倒退到此阶段,如果服务拆分的足够精密,并且独立运行,我感觉就能够将之了解为一个微服务了。

April 23, 2022 · 1 min · jiezi

关于restful:搭建-Restful-Web-服务

1. 了解 REST REST 全称是 Representational State Transfer,中文意思是表征性状态转移。它首次呈现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP标准的次要编写者之一。值得注意的是REST并没有一个明确的规范,而更像是一种设计的格调。如果一个架构合乎REST的约束条件和准则,咱们就称它为RESTful架构。 实践上REST架构格调并不是绑定在HTTP上,只不过目前HTTP是惟一与REST相干的实例。 1.1. REST 准则资源 可通过目录构造款式的 URIs 裸露表述 能够通过 JSON 或 XML 表白的数据对象或属性来传递音讯 应用对立的 HTTP 办法(例如:GET、POST、PUT 和 DELETE)无状态 客户端与服务端之间的交互在申请之间是无状态的,从客户端到服务端的每个申请都必须蕴含了解申请所必须的信息 1.2. HTTP 办法 应用 HTTP 将 CRUD(create, retrieve, update, delete <创立、获取、更新、删除—增删改查>)操作映射为 HTTP 申请。如果依照HTTP办法的语义来裸露资源,那么接口将会领有安全性和幂等性的个性,例如GET和HEAD申请都是平安的, 无论申请多少次,都不会扭转服务器状态。而GET、HEAD、PUT和DELETE申请都是幂等的,无论对资源操作多少次, 后果总是一样的,前面的申请并不会产生比第一次更多的影响。 1.2.1. GET平安且幂等获取信息 1.2.2. POST不平安且不幂等应用申请中提供的实体执行操作,可用于创立资源或更新资源 1.2.3. PUT不平安但幂等应用申请中提供的实体执行操作,可用于创立资源或更新资源 1.2.4. DELETE不平安但幂等删除资源 POST和PUT在创立资源的区别在于,所创立的资源的名称(URI)是否由客户端决定。 例如为我的博文减少一个java的分类,生成的门路就是分类名/categories/java,那么就能够采纳PUT办法。不过很多人间接把POST、GET、PUT、DELETE间接对应上CRUD,例如在一个典型的rails实现的RESTful利用中就是这么做的。 1.3. HTTP status codes 状态码批示 HTTP 申请的后果: 1XX:信息2XX:胜利3XX:转发4XX:客户端谬误5XX:服务端谬误 1.4. 媒体类型 HTTP头中的 Accept 和 Content-Type 可用于形容HTTP申请中发送或申请的内容。如果客户端申请JSON响应,那么能够将 Accept 设为 application/json。相应地,如果发送的内容是XML,那么能够设置 Content-Type 为 application/xml 。 ...

March 9, 2022 · 4 min · jiezi

关于restful:restful-url设计规范参考

1、url命名格调介绍 驼峰命名法 例:http://xxxx/getUser蛇形命名法 例:http://xxxx/get_user脊柱命名法 示例https://help.github.com/articles/why-are-my-commits-linked-to-the-wrong-user/#commits-are-not-linked-to-any-user https://stackoverflow.com/questions/5262224/how-are-reddit-and-hacker-news-ranking-algorithms-used https://api.github.com/2、url大小写及多单词命名准则 1) URL采纳小写字母,数字,局部特殊符号(非制表符)组成。 2) URL中不采纳大小写混合的驼峰命名形式,尽量采纳全小写单词,如果须要连贯多个单词,则采纳连接符“_”或"-"连贯单词,举荐应用后者,即中横线"-"。 3、url门路分级准则 第1级:/api 用于辨别服务接口和动态资源申请,以便做权限拦挡等解决。第2级:/模块名称 对应controller名称,模块名称能够定义两级,即:/父模块名/子模块名,通常将第1级和第2级一起定义到controller门路中,例:/api/user第3级:/动作名称/版本号 对应method名称,例:/add/v14、crud url设计举荐 新增:/api/{module-name}/add/v1 申请形式:post,content-type:application/json 查看:/api/{module-name}/get/{id}/v1 应用场景:进入编辑页面,以及相干详情弹框 申请形式:get,参数放在url中 批改:/api/{module-name}/edit/{id}/v1 申请形式:post,content-type:application/json 删除:/api/{module-name}/del/{id}/v1 申请形式:post,content-type:application/json 列表(默认,带分页,带搜寻):/api/{module-name}/list/v1 申请形式:get,参数放在url中 倡议:不管是否有分页需要,后果全副按分页格局返回,默认可不传分页参数 列表(非默认):/api/{module-name}/list-{datatype}/v1

March 2, 2022 · 1 min · jiezi

关于restful:一个没有-Postman-好用的工具不试一下

忘了 postman 是被谁种草的,很长一段时间内 postman 都是我做接口测试的首选工具,之前也有小伙伴跟我安利过 IDEA 中的 RestfulToolkit 插件,然而始终没机会体验,最近抽空玩了一把,感觉在某些场景下还蛮不错的(不须要认证的场景下),和小伙伴们分享下。 1. RestfulToolkitRestfulToolkit 是一套 RESTful 服务开发辅助工具集,它次要提供了如下性能: 依据 URL 间接跳转到对应的办法定义 ( Ctrl \ or Ctrl Alt N );提供了一个 Services tree 的显示窗口;一个简略的 http 申请工具;在申请办法上增加了有用性能: 复制生成 URL;,复制办法参数...其余性能: java 类上增加 Convert to JSON 性能,格式化 json 数据 ( Windows: Ctrl + Enter; Mac: Command + Enter )。它反对 Spring 体系 (Spring MVC / Spring Boot 1.x,2.x);反对 JAX-RS;反对 Java 和 Kotlin 语言。 2. 装置在 IDEA 中抉择 File->Plugins,而后搜寻 RestfulToolkit,如下: ...

March 2, 2022 · 1 min · jiezi

关于restful:页面录制服务上线RESTful-API-调用实现所见所录即所得

咱们为很多实时互动场景提供了服务。在一些场景中,用户不仅须要实时互动,还须要把互动的过程录下来。那么一个好的录制解决方案到底须要具备哪些特色呢? 在答复这个问题之前,先聊一下客户应用录制的起因。一般来讲,用户应用录制性能的起因次要有三种: 1. 质检。 比方在教育场景下,须要通过回放录制来查看课程品质,在社交直播或金融双录场景下,须要保留录制视频,做合规性审查。 2. 留证。 如教育、医疗、音视频客服等场景,需存档留证以应答可能的纠纷。这种场景下,对录制计划的外围诉求是内容完整性,不能容忍哪怕是秒级的视频丢录。 3. 回放。 比方在教育场景、直播场景下,用户心愿观看回放。这也是大多数实时互动场景里应用录制的次要起因。 那么在这种场景下,怎么才算是一个好的录制解决方案呢? 能够从五个维度来掂量录制计划: 录制成果:须要还原实在的互动场景,包含音视频、课件、白板、聊天信息等所有元素。同时,不能对主播音视频互动体验造成任何负面影响。集成难度:越简略越好,最好是不须要开发。期待时长:期待时长越短越好,最好是录制完结后能够立刻回放。文件兼容性:任何平台、任意浏览器都能够播放。文件迁徙的便利性:文件下载、上传等迁徙过程要非常简单,便于录制文件治理。为了解决各种场景的录制需要,目前有两种比拟支流的计划。 一、音视频、白板等元素别离录制,而后拼接回放次要思路是将音视频、白板、课件、PPT、聊天内容等别离录制下来,录制完结后再别离回放,并通过工夫戳对齐播放进度。这种计划的益处是,白板、课件、聊天内容等均以数据模式回放,能够保留原有的实在互动成果,例如 PPT 能够独自翻页,灵活性较好。但其毛病也非常明显: 1. 集成难度大。 须要同时开发音视频录制、白板录制、聊天内容的录制,特地是各不同元素须要通过工夫戳对齐回放,要做到十分好的同步成果需投入较多开发精力。 2. 播放兼容性受限。 这种形式只能通过非凡播放器来回放,无奈很好地兼容支流播放器。 3. 等待时间长。 为了解决播放兼容性问题,往往须要在录制完结后进行离线解决,转成一个残缺的 MP4 文件,这个过程等待时间较长,还会带来额定的转码老本。 二、本地客户端录屏 不论是本地客户端录制,还是通过屏幕共享将屏幕流发送到云端进行录制,其本质都是在用户的本地客户端上捕捉屏幕内容。这种计划的益处是所见即所得,回放成果跟实在互动场景能够保持一致。但其毛病也是相当显著: 1. 影响本地用户的 RTC 互动体验。 本地捕捉屏幕内容会极大地耗费终端设备的计算资源,如果要实时上传,还会占用主播上行的带宽资源,这些都会影响本地用户的音视频通话体验甚至会呈现卡顿、含糊等重大的结果,这对一个实时互动场景来说是难以承受的致命缺点。 2. 集成难度大。 开发者须要在端上进行开发,须要解决文件本地存储、上传等问题,往往还须要解决简单的混音问题,集成门槛十分高。 除了以上两种支流思路,是否还有其余更好的计划呢? 声网Agora提出了第三种新思路:页面录制页面录制是指通过 Web 页面渲染的形式, 在服务端同步录制音视频、白板、课件以及聊天信息等,还原实在的互动场景。其原理是:开发者通过 RESTful API 发动录制申请,并将待录制页面的 URL 以申请参数的模式发给 Agora 录制服务,Agora 录制服务会关上该Web页面,并以录屏的形式实时录制生成 MP4 文件,上传至指定的第三方云存储平台。具体 页面录制 文档,可点击「浏览原文」浏览。 依据此前录制计划判断维度,将页面录制与此前咱们列举的录制计划相比: 在集成上,通过Restful API发动申请录制,简略易用。录制成果实现所见即所得的,将音视频、白板、课件以及聊天信息等内容全副同时录制下来,且不带来额定的带宽、性能开销,录制过程不影响任何主播/观众的RTC互动体验。录制完结后,能够实时生成MP4文件,兼容各支流播放器。文件下载非常简单,便于录制文件治理。同时,页面录制具备录制任意网页页面的能力,所以用 WebRTC 或其它计划自研 RTC 性能的开发者同样能够应用。

October 26, 2021 · 1 min · jiezi

关于restful:REST-API知识整理

一、介绍(REST) REST即Representational State Transfer的缩写,"体现层状态转化"。REST API是前后端拆散的最佳实际,是开发的一套规范或者说是一套标准,不是框架。益处:1、轻量,间接通过http,不须要额定的协定,通常有post/get/put/deletec等操作;2、面向资源,高深莫测,具备自解释性;3、数据形容简略,个别通过json或者xml实现数据间的通信。 二、资源(Resources) REST的名称"体现层状态转化"中,省略了主语。"体现层"其实指的是"资源"(Resources)的"体现层"。所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它能够是一段文本、一张图片、一种服务,总之就是一个具体的切实。你能够用一个URI(对立资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,拜访它的URI就能够,因而URI就成了每一个资源的地址或举世无双的辨认符。所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。三、体现层(Representation) "资源"是一种信息实体,它能够有多种外在表现形式。"资源"具体出现进去的模式,叫做它的"体现层"(Representation)。比方,文本能够用txt格局体现,也能够用HTML格局、XML格局、JSON格局体现,甚至能够采纳二进制格局;图片能够用JPG格局体现,也能够用PNG格局体现。URI只代表资源的实体,不代表它的模式。严格地说,有些网址最初的".html"后缀名是不必要的,因为这个后缀名示意格局,属于"体现层"领域,而URI应该只代表"资源"的地位。它的具体表现形式,应该在HTTP申请的头信息中用Accept和Content-Type字段指定,这两个字段才是对"体现层"的形容。四、状态转化(State Transfer) 拜访一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必波及到数据和状态的变动。互联网通信协议HTTP协定,是一个无状态协定。这意味着,所有的状态都保留在服务器端。因而,如果客户端想要操作服务器,必须通过某种伎俩,让服务器端产生"状态转化"(State Transfer)。而这种转化是建设在体现层之上的,所以就是"体现层状态转化"。客户端用到的伎俩,只能是HTTP协定。具体来说,就是HTTP协定外面,四个示意操作形式的动词:GET、POST、PUT、DELETE。别离对应四种基本操作:GET用来获取资源,POST用来新建资源(也能够用于更新资源),PUT用来更新资源,DELETE用来删除资源。五、综述综合下面的解释,总结一下什么是RESTful架构:1、每一个URI代表一种资源;2、客户端和服务器之间,存在传递这种资源的某种体现层;3、客户端通过四个HTTP动词,对服务器端资源进行操作,实现"体现层状态转化"。

October 14, 2021 · 1 min · jiezi

关于restful:布道APIREST-从来都不是基于-CRUD

一个重大的误会是 REST 的 API 必须是基于 CRUD 的,这两者之间没有任何的分割,都只是API设计格调的一种形式而已。本文还将介绍基于 REST 的 API 的几种实现规定。 CRUD简介基于 CRUD 的 API 是指提供蕴含实例的资源汇合的 API,效仿 create、read、update 和 delete 生命周期模式。当有一组代表内容或状态的资源实例时,CRUD 模式很有用,它通常遵循以下模式: GET /articles – 列出/分页/过滤文章列表POST /articles – 创立新文章GET /articles/{articleId} – 获取文章详情PATCH /articles/{articleId} – 更新文章详情DELETE /articles/{articleId} – 删除指定ID的文章REST:超过 CRUD在探讨 CRUD 之外的API格调之前,须要廓清一个对于 REST 的重大误会: CRUD 并不是对“RESTful”API 的要求。事实上,在 Fielding’s dissertation 的论文中并没有提及 CRUD 。 在谈到基于 REST 的 API 时,很多人将利用基于 CRUD 格调的资源与 REST 格调混同一起。然而,这些其实是 HTTP 形象的资源概念,与数据库设计没有间接关系: 本标准没有限度可能是资源,相同“资源”一词是在个别意义上应用的用于任何可能被 URI 标识的内容。—— RFC 3986REST 是标准客户端和服务端之间通信的形式,利用 HTTP 协定提供的性能,这些限度能够自在地专一于 API 设计: ...

June 20, 2021 · 2 min · jiezi

关于restful:布道-API浅谈-API-设计风格

API 格调是一个备受争议的话题,大多数开发者都相熟 REST 与 GraphQL 的争执,更不用说其余格调了。本文将介绍常见的8种不同的API格调。 API有哪些格调呢?依照不同的特色能够分为五类,如下: Web API:REST 和 so-called REST查问 API:GraphQL公布订阅 API:包含 Kafka 和 WebSubRPC API :SOAP 和 gRPC一般的文件传输束缚、属性具体应用哪种API格调,个别须要思考束缚、属性和关键因素,这里不思考架构的影响因素。 思考以下束缚和属性之间关系的示例: 解耦(束缚)的 API 实质上是可批改的(属性)无状态(束缚)的 API 实质上是牢靠的(属性)和可扩大的(属性)实现对立接口(束缚)的 API 实质上是简略的(属性)当然,束缚也会导致负面属性,例如,效率低下是一种可能由对立接口的束缚引起的。然而,要抉择正确的 API 格调,须要思考对我的项目团队因素(效率、品质、老本)。 要抉择想要的属性,须要思考团队的局限性。 业务限度:例如用例、客户要求、公布工夫地区限度:例如地区政策限度技能限度:例如团队文化、团队技能复杂性限度:包含格调难度、可扩展性需要和算法复杂性除了下面的思考因素,你可能发现要构建具备特定属性的API,还有一些常见的思考因素,如可移植性、可见性和安全性。是的,上面的因素也是须要思考的: 性能可扩展性易用性可修改性可靠性可发现性易于开发老本和后面的因素相比,上面的因素不那么要害但又不得不思考: 成熟度企业适用性工具社区特定格调的资源易于凋谢抉择正确 API 格调的倡议:综合思考以上的因素就会晓得抉择哪种格调,但要做到这一点,还须要晓得常见的八种 API 格调在束缚、特色。RESTREST(REpresentational State Transfer),首次呈现在 2000 年 Roy Thomas Fielding 的博士论文中,提出了一种万维网的软件架构格调-REST(全称:Representational State Transfer, 体现层状态转换),目标是便于在不同软件/程序中(例如互联网)中相互传递信息。它指的是一组架构约束条件和准则。满足这些约束条件和准则的应用程序或设计就是 REST 的。 束缚:客户端-服务器、无状态、可缓存、分层零碎、按需代码、对立接口 特色:性能、简略性、可扩展性、可见性、可移植性、可发现性、可修改性、可靠性 REST 非常适合构建长久的可扩大零碎。它也是一种绝对灵便和成熟的格调,因而实用于内容协商、多媒体和顶级身份验证等内容。So-called RESTcalled和so-called都示意所谓,区别在于,前者是名词性从句,后者是一个形容词,因而在REST的设计上次要在于端点的设计。 束缚:客户端-服务器、无状态、可缓存、分层零碎、按需代码、对立接口 特色:性能、简略性、可扩展性、可见性、可移植性、可发现性、可靠性 So-called REST 是大多数团队的首选,因为遵循 HTTP 协定并提供 REST 的所有属性,对立接口。可怜的是,没有这种束缚意味着 So-called REST 提供的可修改性很差。GraphQLGraphQL是一个开源的,面向API而发明进去的数据查问操作语言以及相应的运行环境。 于2012年仍处于Facebook外部开发阶段,直到2015年才公开公布。 2018年11月7日,Facebook将GraphQL我的项目转移到新成立的GraphQL基金会。 ...

June 20, 2021 · 1 min · jiezi

关于restful:开源接口管理工具基于Vue和Eelctron

传送门GitHub地址Gitee地址残缺文档 前言【高兴摸鱼】是一款基于Vue和Electron的开源接口管理工具。最后构建这个我的项目的时候是为了学习Node.js和解决团队前后端协调问题。社区中有 YApi 、Rap2、Doclever、 Nei、Swagger、Apidoc等开源解决方案,同时也存在 Postman、Eolinker、ApiPost等商业解决方案。 在这之前团队尝试了YApi和Rap2等社区计划,他们可能满足一些根本的需要,然而在深刻应用当前,还是呈现了一些影响效率的问题。过后应用这两个工具最大的问题就是接口无奈反对多级嵌套,某些我的项目接口多了当前会导致检索效率大大降低。于是尝试从头开始写一款接口管理工具。 团队合作 十分外围的一个性能,在前后端拆散状况下,一套简洁的团队管理策略会大大提高分工效率。咱们将权限分为 只读、读写、管理员三类。 只读:只容许用户查看文档(个别能够给前端开发人员赋予这个角色)读写:容许对文档进行增删改查等(个别能够给后端开发人员赋予这个角色)管理员:除了读写以外还能够减少或者删除用户 下面的三种角色能够满足大部分日常应用需要。在一些非凡状况下你可能须要更加细粒度的权限管制,比方:领有读写权限的用户你只心愿他能编辑文档,但不心愿他能导出全副文档。咱们提供了自定义角色性能,能够准确到每一个接口和路由(个别状况下用不到)。 【权限治理】 目录导航 十分外围的一个性能,设计一个不便并且易使用的目录导航可能大大加强录入体验。咱们从其余开源我的项目issue中总结了一些常见需要。 反对有限级别嵌套反对拖拽文件反对拖拽目录反对单个或者批量拷贝文件反对单个或者多个拷贝目录反对一些右键菜单可能批量删除导航栏接口要与目录联动开展 工具实现了下面的全副性能,同时也扩大了一些实用的性能。 单个目录上面领有超过10个文档会升高文档检索效率,默认状况下工具限度单个目录只容许8个文档存在,当然也容许你自定义限度个数。因为目录导航空间无限,工具容许你应用Ctrl + 鼠标左键来查看节点的额定信息【批量删除节点】 【批量文档复制粘贴】 标签导航 标签导航是为了不便开发人员在多个接口之间疾速切换,开源的产品这块做的并不是很欠缺,咱们在实践中总结了这些需要。 顶部导航标签要与左侧目录导航一起联动导航标签要容许拖拽导航标签须要鼠标右键操作在文档产生变动的时候导航标签须要有小圆点提醒导航标签须要标注申请类型 大部分商用的接口工具都具备导航标签性能,然而开源产品这块大都不具备标签导航性能或者性能完成度不高【导航栏相干操作】 接口调试(模仿申请) 大部分的接口工具都会内置接口调试性能,这样开发人员只须要应用一个工具就能实现接口调试和接口录入。不过因为浏览器自身的限度(同源策略),间接在web端发动HTTP申请大概率会失败。这里列举了一些常见的解决方案。 计划毛病浏览器插件插件装置、Cookie反对度不高远端服务器代理转发相似192.168.0.0这种内网网段无法访问应用客户端(Electron)须要装置客户端从技术上来说,应用客户端来躲避同源策略是一种比拟好的实际,同时依靠客户端弱小的api还能实现很多web端无奈实现的事件,当然装置客户端也会给用户带来一些不不便。目前支流的商业我的项目大都采纳客户端的模式来为用户提供接口调试性能,局部工具甚至不提供web端的应用。咱们采纳了客户端的形式来实现接口调试,同时也保留了web端的应用性能,除了接口调试和Mock性能无奈应用外,web端和客户端在性能上没有其余区别。咱们也会在将来提供浏览器插件性能,这样用户就能够在web端应用接口调试性能了 咱们总结一些常见的接口调试需要 反对常见的GET、POST、PUT、DELETE、OPTIONS、PATCH反对RESTFUL类型查问参数反对 x-www-form-urlencoded、multipart/form-data、json、xml、binary等常见MIME类型multipart/form-data反对传递文件反对自定义Header反对发送Cookie反对自定义变量反对格式化的预览返回值,json,text/html,image等类型前置操作,后置操作websocket 【非JSON类型格局数据返回展现】 【json类型返回数据展现】 接口录入 对接口的增删改查是整个接口工具最外围的局部,常见的开源产品对 申请参数(Body),多个返回参数方面反对比拟弱。咱们总结了在典型业务场景下,接口录入应该蕴含以下外围模块。 申请办法和申请URL录入接口标签录入申请参数(Params) /api/demo?id=3&name=lee申请参数(Path) /api/demo/{id}申请参数(Body) noneform-data(能够传文件)x-www-form-urlencoded(表单提交形式)application/jsontext/plain、text/plain、application/javascript、application/xml等 MIME类型binary申请头返回参数(通常来说能够增加多个返回参数)备注信息(富文本格式)草稿状态变量反对反对丰盛的参数类型 Number、Integer、String、Array、Object、File、Binary、Boolean、Null、Enum 接口工具辨别body录入形式,目标是对某些特定类型数据进行格式化解决,这些数据都通过HTTP body传输,程序通过header外面的Content-Type辨别数据格式。【接口录入工作区】 除了欠缺必要的接口模块,工具还在录入效率方面想了很多方法。咱们从Yapi、Rap2等开源我的项目issue中整顿用户常见的录入需要。 每个字段的录入都心愿存在补全性能参数模板性能json类型数据导入性能,并且能主动补全备注发送模仿申请时,心愿能将实在返回值利用于文档【字段快捷补全】 【参数模板】 【json数据导入】 【返回参数利用于文档】 导入性能 目前市面上接口工具总类繁多,在解决导入的时候会有以下几个次要问题。 大部分接口工具并没有严格的数据格式定义以后零碎数据接口并不能很好的和第三方接口兼容局部工具不提供可解决格局数据(JSON,YAML等)导出性能openapi/swagger这类标准细节十分丰盛,须要解决大量逻辑openapi/swagger这类标准,用户未能严格依照标准书写导致导入出错导入数据会有一些额定的配置需要(eg: 指定导出地位,指定导出数据量等) 目前比较稳定和被广泛认可的标准是OpenAPI标准,很多商业化的工具都是反对这种标准的。postman这类工具领有十分大的市场占有率,大部分工具也都反对这种类型数据导入。咱们收集了一些罕用的接口工具,并且列出了工具对导入的反对状况。 文档类型反对度备注Openapi/Swagger反对单个文件、反对3.0及以上版本、兼容常见语法规定、提供长期反对openpai标准领有十分丰盛的实现细节,工具将会长期欠缺并且兼容这个标准、将来会提供多文件导入反对postman反对2.1及以上版本、兼容常见语法规定、提供长期反对Yapi反对导入、兼容常见语法规定开源社区十分闻名的接口工具,遗憾的是曾经不再保护,咱们提供迁徙反对Rap2暂不反对筹备反对ShowDoc暂不反对 Nei暂不反对 Docway暂不反对 ApiPost暂不反对 Eolinker暂不反对筹备反对在惯例导入需要下面,咱们扩大了一些性能,进步了局部我的项目内迁徙效率。 容许多个我的项目之间相互导出数据容许用户指定导入时候挂载目录【我的项目内相互导入】 【额定导入数据配置】 导出性能 导出性能一方面是不便用户分享文档给第三方用户,另一方面也提供了肯定的迁徙和备份能力。上面是一些常见的导出场景 导出格局是否反对备注JSON(摸鱼格局)反对高兴摸鱼.json、提供标准接口数据导出,不便用户备份或者迁徙到其余接口工具、反对指定内容导出HTML反对高兴摸鱼.html、提供十分残缺的预览性能反对、反对指定内容导出Markdown暂不反对筹备反对PDF暂不反对筹备反对Word反对无限基于officegen、目录生成性能缺失、款式较为俊俏OpenApi暂不反对筹备反对能够应用openapi丰盛的工具链 生成在线链接反对在线链接(明码:111111)、反对指定内容导出、在分享第三方的时候会十分的有用因为HTML领有十分不错的UI体现能力,咱们破费了相当多的精力在动态HTML上。咱们举荐应用HTML作为首选的离线文档。 【按需导出】 回收站和日志性能 日志性能是团队治理和平安操作中十分重要的一环,工具对接口的每一步操作都做具体记录。 ...

June 4, 2021 · 1 min · jiezi

关于restful:针对-Restful-协议下的接口测试平台设计

利用背景 目前市场上很多 Web 利用转向了 RESTful 的架构,往往裸露给用户的往往就是一组 REST API,这样的益处就是,研发人员能够依据须要调用不同的 API,整合出本人的利用进去。 这样每组 API 就会造成一个信息中心,各个信息中心联合在一起,就造成了一个互联互通的信息架构。所以针对此种轻量级的风行架构,接口服务的场景测试必不可少,目前支流的 postman 或者 jmeter 之类的工具尽管也能够胜任,然而对于整体设计来说总是欠缺一些什么。 像阿里巴巴之类的大厂始终在推举本人自定义去做一些品质平台,有针对性的去设计适宜本人产品的测试计划,这里存在一个开源的接口服务框架,能够反对 restful 协定,并能够反对 xml、json 之类的数据格式的传输、验证、断言等。 REST Assured 是一套由 Java 实现的 REST API 测试框架,它是一个轻量级的 REST API 客户端,能够间接编写代码向服务器端发动 HTTP 申请,并验证返回后果;它的语法十分简洁,是一种专为测试 REST API 而设计的 DSL。 官网地址: https://rest-assured.io/官网文档: https://rest-assured.io/#docsGithub我的项目地址: https://github.com/rest-assur... 简略的实际 如果在 IDE 配置一个简略些的接口测试环境,那咱们首先能够将 REST Assured 配置到 Maven 中: 配置好后,咱们来看一个典型的测试案例: 在 src/test/java 下创立一个包,起名叫 OurTest,在该包下创立一个 GioApiTests 类 接下来咱们来看一下代码: public class OurTest{@Testpublic void getAddress(){given() requestApplication.get(s:”https://ip:8090/trueTest/com/ourname/226514”) Response .then()ValidateReponse.statusCode(200);}@Testpublic void postOurName(){String json=”{“\firstName\“:\”wangtao\”,\”secondName\”:\”tao\”}”;given() RequestApplication.contentType(“application/json“)RequestApplication.body(json)RequestApplication.post(s:”ip:8090/trueTest/com/ourname”)response.then()ValidateReponse.statusCode(200);}}上面咱们来解释一下: ...

May 17, 2021 · 2 min · jiezi

关于restful:DjangoRestFramework框架简介及基本使用

本文首发于:行者AI在python我的项目开发中,前后端拆散的技术框架越来越成熟,在前后端进行通信时,通常须要用对立的格局进行通信,目前利用比拟宽泛的是RESTful API。那后端如何疾速编写基于Django的RESTful API呢?本篇将次要介绍应用DjangoRestFramework(drf)框架来疾速开发合乎REST格调的API。 1. drf概念及特点1.1 概念drf框架是基于Django框架,用于疾速构建Web RESTful API的工具。 1.2 特点(1) 提供了定义序列化器Serializer的办法,能够疾速依据Django ORM 或者其余库主动序列化、反序列化; (2) 提供了丰盛的类视图、MIXIN扩大类,依据需要组合继承,简化视图的编写; (3) 丰盛的定制层级:函数视图、类视图、视图汇合到主动生成 API,满足各种须要; (4) 反对多种身份认证和权限认证形式; (5) 内置了限流零碎; (6) 可视化API接口; (7) 可扩展性 , 插件丰盛。 2. drf的应用drf对代码的简化次要是对视图的增删改查、申请数据的反序列化和响应数据的序列化进行简化,所以次要介绍drf的序列化器和视图集的应用。 2.1 搭建我的项目搭建我的项目环境,创立我的项目exercise,创立app利用student,代码如下: # python==3.6.5virtualenv -p /python/python.exe /virtualenv/exerciseenvcd /virtualenv/exerciseenv/Scripts/activatepip install django==3.1.5 pymysql==1.0.2 djangorestframework==3.12.2cd /study/django-admin startproject exercisecd exercisedjango-admin startapp student目录构造如下: 而后关上我的项目在/exercise/settings.py文件中配置数据库,注册app(student和rest_framework)。 2.2 创立模型在/student/models.py文件中,建设三张表:班级(Grade)、课程(Course)、学生(Student)。 class Grade(models.Model): # 班级 name = models.CharField(max_length=16, null=False, unique=True) class Meta: db_table = 'grade' ordering = ['id']class Course(models.Model): # 课程 name = models.CharField(max_length=32, unique=True, null=False) class Meta: db_table = 'course' ordering = ['id']class Student(models.Model): # 学生 name = models.CharField(max_length=16, null=False) age = models.IntegerField(null=True) gender = models.BooleanField(null=False, default=0) g = models.ForeignKey(Grade, on_delete=models.CASCADE) c = models.ManyToManyField(Course) class Meta: db_table = 'student' ordering = ['id']2.3 创立序列化器在/student/serializers.py文件中,建设三个模型对应的序列化器;序列化器有两个次要性能:序列化和反序列化。如果前端是GET申请,则结构查问集,将后果返回,这个过程为序列化;如果前端是POST申请,要对数据库进行改变,则须要拿到前端发来的数据,进行校验,校验通过将数据写入数据库,这个过程称为反序列化。这能极大的简化视图代码量,前面会做个比照。代码如下: ...

January 28, 2021 · 3 min · jiezi

关于restful:RESTful-API如何进行版本控制

本文将帮忙您了解为什么须要版本控制,以及如何对REST API进行版本控制。咱们将探讨4种版本控制的办法,并比拟不同的办法。 您将学到 为什么咱们须要对RESTful API 进行版本控制?可用的版本控制有哪些?如何实现基于 Restful 的版本控制?为什么咱们须要对RESTful API进行版本化最好的版本控制办法是不进行版本控制。只有不须要版本控制,就不要版本控制。 构建向后兼容的服务,以便尽可能防止版本控制!然而,在许多状况下咱们都须要进行版本控制,然咱们看看上面具体的例子: 最后,你有个这个版本的Student服务,返回数据如下: { "name": "Bob Charlie"}起初,您心愿将学生的名字拆分,因而创立了这个版本的服务。 { "name": { "firstName": "Bob", "lastName": "Charlie" }}您能够从同一个服务反对这两个申请,然而随着每个版本的需要多样化,它会变得越来越简单。 在这种状况下,版本控制就成必不可少,强制性的了。 接下来让咱们创立一个简略的SpringBoot的maven我的项目,并了解对 RESTful 服务进行版本控制的4种不同办法。 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency></dependencies>几个用于实现版本控制的Bean第一个版本的 Bean @Data@AllArgsConstructorpublic class StudentV1 { private String name;}第二个版本的 Bean @Datapublic class StudentV2 { private Name name;}StudentV2应用的Name实体 @Data@AllArgsConstructorpublic class Name { private String firstName; private String lastName;}Restful 版本控制的办法咱们心愿创立两个版本的服务,一个返回 StudentV1,另一个返回 StudentV2。 ...

January 26, 2021 · 2 min · jiezi

关于restful:restful风格请求基于token鉴权实例

点赞再看,养成习惯 开发环境:jdk 8intellij ideamaven 3.6所用技术:springbootrestful我的项目介绍基于restful格调做的设计实例,即可jwt做token效验,实现增删查改,同时搭配自定义注解,不便过滤token验证 自定义注解1.须要做验证的注解 @Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface UserLoginToken { boolean required() default true;}//拦挡类(AuthenticationInterceptor)代码public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception { String token = httpServletRequest.getHeader("token");// 从 http 申请头中取出 token // 如果不是映射到办法间接通过 if(!(object instanceof HandlerMethod)){ return true; } HandlerMethod handlerMethod=(HandlerMethod)object; Method method=handlerMethod.getMethod(); //查看是否有passtoken正文,有则跳过认证 if (method.isAnnotationPresent(PassToken.class)) { PassToken passToken = method.getAnnotation(PassToken.class); if (passToken.required()) { return true; } } //查看有没有须要用户权限的注解 if (method.isAnnotationPresent(UserLoginToken.class)) { UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class); if (userLoginToken.required()) { // 执行认证 if (token == null) { throw new RuntimeException("无token,请从新登录"); } // 获取 token 中的 user id String userId; try { userId = JWT.decode(token).getAudience().get(0); } catch (JWTDecodeException j) { throw new RuntimeException("token error"); } String user = jedis.get(userId); if (user == null) { throw new RuntimeException("用户不存在,请从新登录"); } // 验证 token JSONObject jsonObject1=JSONObject.parseObject(user); JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(jsonObject1.getString("planType"))).build(); try { jwtVerifier.verify(token); } catch (JWTVerificationException e) { throw new RuntimeException("token error"); } return true; } } return true;}我的项目构造申请列表图片 ...

January 5, 2021 · 2 min · jiezi

关于restful:你知道什么是-Restful-风格吗SpringMVC-带我们实现它

你晓得什么是 Restful 格调吗?SpringMVC 带咱们实现它!Restful 格调的 API 是一种软件架构格调,设计格调而不是规范,只是提供了一组设计准则和约束条件。它次要用于客户端和服务器交互类的软件。基于这个格调设计的软件能够更简洁,更有档次,更易于实现缓存等机制。 在 Restful 格调中,用户申请的 url 应用同一个 url 而用申请形式:get,post,delete,put…等形式对申请的解决办法进行辨别,这样能够在前后台分离式的开发中使得前端开发人员不会对申请的资源地址产生混同和大量的查看办法名的麻烦,造成一个对立的接口。 SpringMVC Restful 格调 url 配置实现的形式SpringMVC 的 resturl 是通过 @RequestMapping 及 @PathVariable annotation 提供的,通过如 @RequestMapping(value="/blog /{id}",method=RequestMethod.DELETE) 即可解决 /blog/1 的 delete 申请。 GET(SELECT):从服务器查问,能够在服务器通过申请的参数辨别查问的 形式。POST(CREATE):在服务器端新建一个资源,调用 insert 操作。PUT(UPDATE):在服务器端更新资源,调用 update 操作。PATCH(UPDATE):在服务器端更新资源(客户端提供扭转的属性)。(目前 jdk7 未实现,tomcat7 不反对)。DELETE(DELETE):从服务器端删除资源,调用 delete 语句。案例实操Get 申请配置/***restful-->get 申请 执行查问操作* @param id* @return*/@RequestMapping(value="queryAccountById02/{id}",method=RequestMethod.GET,produces=MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic MessageModel queryAccountById(@PathVariable Integer id){ MessageModel messageModel=new MessageModel(); if(null==id){ messageModel.setCode(300); messageModel.setMsg("参数非法!"); return messageModel; } messageModel.setResult(accountService.queryById(id)); return messageModel; } Post 申请配置/*** restful-->post 申请执行增加操作* @param id* @param aname* @return*/@RequestMapping(value="saveAccount",method=RequestMethod.POST,produces=MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic MessageModel queryAccountById04(@RequestBody Account account){ MessageModel messageModel=new MessageModel(); try { accountService.saveOrUpdateAccount(account); } catch (ParamsException e) { e.printStackTrace(); messageModel.setCode(e.getErrorCode()); messageModel.setMsg(e.getErrorMsg()); }catch (Exception e) { e.printStackTrace(); messageModel.setCode(300); messageModel.setMsg("操作失败!"); } return messageModel; } Put 申请配置/*** restful-->put 申请执行更新操作* @param id* @param account* @return*/@RequestMapping(value="update/{id}",method=RequestMethod.PUT,produces=MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic MessageModel queryAccountById04(@PathVariable Integer id,@RequestBody Account account){ MessageModel messageModel=new MessageModel(); try { accountService.saveOrUpdateAccount(account); } catch (ParamsException e) { e.printStackTrace(); messageModel.setCode(e.getErrorCode()); messageModel.setMsg(e.getErrorMsg()); }catch (Exception e) { e.printStackTrace(); messageModel.setCode(300); messageModel.setMsg("操作失败!"); } return messageModel; } Delete 申请配置 /** * restful-->delete 申请 执行删除操作 * @param id * @return */@RequestMapping(value="deleteAccountById/{id}",method=RequestMethod.DELETE,produces=MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic MessageModel queryAccountById05(@PathVariable Integer id){ MessageModel messageModel=new MessageModel(); try { accountService.deleteAccountById(id); } catch (ParamsException e) { e.printStackTrace(); messageModel.setCode(e.getErrorCode()); messageModel.setMsg(e.getErrorMsg()); }catch (Exception e) { e.printStackTrace(); messageModel.setCode(300); messageModel.setMsg("操作失败!"); } return messageModel;} 扩大~RESTREST(英文:Representational State Transfer,简称REST)形容了一个架构款式的网络系统,比方 web 应用程序。它首次呈现在 2000 年 Roy Fielding 的博士论文中,Roy Fielding是 HTTP 标准的次要编写者之一。在目前支流的三种Web服务交互计划中,REST相比于SOAP(Simple Object Access protocol,简略对象拜访协定)以及XML-RPC更加简单明了,无论是对URL的解决还是对Payload的编码,REST都偏向于用更加简略轻量的办法设计和实现。值得注意的是REST并没有一个明确的规范,而更像是一种设计的格调。 ...

December 10, 2020 · 1 min · jiezi

关于restful:restFul风格两种实现方式

restFul格调实现1作用:能够动静的接管url中的地址。语法: 1.url中的地址如果是参数,则须要应用/宰割2.controller办法接管参数时,须要使{}号来获取3.如果须要获取参数信息,则应用特定的注解标识@RequestMapping("/page/{moduleName}")public String module(@PathVariable String moduleName){ return moduleName; }restFul格调实现2须要指定拜访申请类型,并且依据特定的类型执行业务。那么,什么叫指定拜访申请类型? 申请类型常见的有多少种? 1.post 执行入库操作2.get 执行查问的操作3.put 执行更新操作4.delete 执行删除操作@RequestMapping(value = "/page/{moduleName}",method = RequestMethod.GET) public String module(@PathVariable String moduleName){ return moduleName; }简化restFul格调实现2的代码 @GetMapping("/page/{moduleName}")public String module(@PathVariable String moduleName){ return moduleName;}

November 6, 2020 · 1 min · jiezi

关于restful:从零开始搭建完整的电影全栈系统三restfulApi的编写

创立API利用入口:1,复制 backend ⾄ api, environments/dev/backend ⾄ environments/dev/api 以及 environments/prod/backend ⾄ environments/prod/api.2,批改配置⽂件main.php,须要批改应⽤id、命名空间、⽤户组件和url丑化的配置内容 'id' => 'app-api','controllerNamespace' => 'api\controllers',3,在 commonconfigbootstrap.php 中增加api的门路别名 Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');独自创立api入口的益处:独自创立API应⽤,⽬的是便于保护。能够防止这些问题:• 配置的抵触 • 控制器的命名不便 • url丑化规定抵触 创立第⼀个API应⽤:1,创立了vod-detail控制器:VodDetailController.php <?phpnamespace api\controllers;use Yii;use common\models\VodDetail;use common\models\VodDetailSearch;use yii\rest\ActiveController;use yii\web\Controller;use yii\web\NotFoundHttpException;use yii\filters\VerbFilter;/** * VodDetailController implements the CRUD actions for VodDetail model. */class VodDetailController extends ActiveController{ public $modelClass = 'common\models\VodDetail';}2,在配置⽂件中,创立了针对vod-detail管制器的url丑化规定:main.php: 'urlManager' => [ 'enablePrettyUrl' => true, //严格解析 至多要合乎rules中的一条,否则抛出异样 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [ [ 'class' => 'yii\rest\UrlRule', 'controller' => 'vod-detail', ], ], ],3,配置main-local⽂件,让API应⽤能接管 JSON 格局的输⼊数据:main-local.php: ...

September 10, 2020 · 1 min · jiezi

关于restful:restful风格

平时跳转页面并传递参数时,咱们能够通过url?拼接参数的形式来进行,还能够通过restful来实现跳转. 定义RESTFUL是一种网络应用程序的设计格调和开发方式,基于HTTP能够应用XML格局定义或JSON格局定义 利用场景当用户发动申请时,其中有多个申请都是相似的性能时(例如:只是跳转页面),是否用一个controller来实现通用的跳转? 实现就须要用restful格调来动静的接管url中的参数restful格调实现: 参数与参数之间由"/"分隔参数应用{}模式包裹controller类参数@PathVarible实现数据的转化总结如果须要获取url地址中的参数时,则能够应用restful格调实现须要依照类型执行特定的性能(type="get"--查/"post"--增...)跳转.@Controllerpublic class IndexController { /** * 对于通用页面跳转的阐明 * url地址: /page/item-add * url地址: /page/item-list * url地址: /page/item-param-list * 依照惯例: 1个申请对应的1个controller办法 * 需要: 是否利用一个办法履行页面的通用的跳转. * 想法: 是否动静的接管url中的参数呢?? * * restFul格调实现1: * 1.参数与参数之间应用/分隔 * 2.参数应用{}模式包裹 * 3.@PathVariable 实现数据的转化. * * restFul格调实现2: * 能够利用申请的类型,指定业务性能. * TYPE="GET" 查问业务 * TYPE="POST" 新增业务 * TYPE="PUT" 更新业务 * TYPE="DELETE" 删除业务 * * 总结1: 如果须要获取url地址中的参数时,则能够应用RestFul格调实现. * 总结2: 能够依照类型执行特定的性能. */ //@RequestMapping(value = "/page/{moduleName}",method = RequestMethod.GET) @GetMapping("/page/{moduleName}") public String itemAdd(@PathVariable String moduleName){ //目标:跳转页面 item-add return moduleName; }}

August 29, 2020 · 1 min · jiezi

关于restful:开发出优秀的API构建RESTful-API的13种最佳实践

首发于公众号《前端全栈开发者》,第一工夫浏览最新文章,会优先两天发表新文章。Facebook、GitHub、Google以及其余许多巨头都须要一种服务和生产数据的形式。在当今的开发环境中,RESTful API依然是服务和生产数据的最佳抉择之一。 然而你是否思考过学习行业标准?设计RESTful API的最佳实际是什么?从实践上讲,任何人都能够在不到五分钟的工夫内疾速启动数据API——无论是Node.js,Golang还是Python。 咱们将探讨在构建RESTful API时应思考的13种最佳实际。但首先,让咱们疾速说明RESTful API。 什么是RESTful API?RESTful API须要满足以下束缚能力被称为RESTful API。 客户端-服务器模型:RESTful API遵循客户端-服务器模型,其中服务器为数据提供服务,而客户端连贯到服务器以应用数据。客户端和服务器之间的交互是通过HTTP(S)申请进行的,该申请传输了申请的数据。无状态:更重要的是,RESTful API应该是无状态的。每个申请都被视为独立申请。服务器不应跟踪可能影响未来申请后果的任何外部状态。对立接口:最初,一致性定义了客户端和服务器之间的交互方式。RESTful API定义了命名资源的最佳实际,但定义了容许你批改资源/与之交互的固定HTTP操作。能够在RESTful API中拜访以下HTTP操作: GET申请:检索资源POST申请:创立资源或将信息发送到APIPUT申请:创立或替换资源PATCH申请:更新现有资源DELETE申请:删除资源在对RESTful API的个性有了更深刻的理解后,是时候理解更多对于RESTful API的最佳实际了。 本文为你提供了13种最佳实际的可行清单。让咱们来摸索! 1.正确应用HTTP办法咱们曾经探讨了可用于批改资源的HTTP办法:GET,POST,PUT,PATCH和DELETE。 尽管如此,许多开发人员还是偏向于滥用GET和POST或PUT和PATCH。通常,咱们看到开发人员应用POST申请来检索数据。此外,咱们看到开发人员应用PUT申请来替换资源,而他们只想更新该资源的单个字段。 确保应用正确的HTTP办法,因为这将为应用你的RESTful API的开发人员减少很多凌乱。最好是保持应用预约的准则。 2.命名约定理解RESTful API命名约定将对你有组织地设计API有很大帮忙。依据你服务的资源设计一个RESTful API。 例如,你的API治理着作者和书籍(是的,一个经典的例子)。当初,咱们要增加一个新作者或拜访一个ID为 3 的作者。你能够设计上面的路由来达到这个目标: api.com/addNewAuthorapi.com/getAuthorByID/3设想一下,一个API承载了许多资源,每个资源都有许多属性。可能的端点列表将变得无穷无尽,而且对用户不是很敌对。所以咱们须要一种更有条理和标准化的形式来设计API端点。 RESTful API最佳实际形容了端点应以资源名称结尾,而HTTP操作则形容操作。当初咱们失去: POST api.com/authorsGET api.com/authors/3如果咱们想拜访ID为 3 的作者已经写过的所有书籍怎么办?对于这种状况,RESTful API也有解决办法: GET api.com/authors/3/books最初,如果您要为ID为 3 的作者删除ID为 5 的书,该怎么办?同样,让咱们遵循雷同的结构化办法来造成以下端点: DELETE api.com/authors/3/books/5简而言之,利用HTTP操作和资源映射的结构化形式来造成易于了解的端点门路。这种办法的最大长处是,每个开发人员都理解RESTful API的设计形式,他们能够立刻应用API,而不用浏览你的每个端点的文档。 3.应用复数资源资源应始终应用其复数模式。为什么?假如你要检索所有作者。因而,你将调用以下端点:GET api.com/authors。 当你读取申请时,你无奈判断API响应是否只蕴含一个或所有作者。因而,API端点应该应用复数资源。 4.正确应用状态码状态码在这里不只是为了好玩,它们有一个明确的目标,状态码告诉客户端申请的胜利。 最常见的状态码类别包含: 200(OK):申请已胜利解决并实现。201(Created):批示胜利创立资源。400(Bad Request):代表客户端谬误。也就是说,申请的格局不正确或短少申请参数。401(Unauthorized):未受权,你尝试拜访你没有权限的资源。404(Not Found):申请的资源不存在。500(Internal Server Error):外部服务器谬误,服务器在执行申请期间引发异样。状态码的残缺列表能够在Mozilla Developers找到。 5.遵循雷同约定最常见的是,RESTful API提供JSON数据,因而,应遵循camelCase大小写常规。然而,不同的编程语言应用不同的命名约定。 6.如何解决搜寻,分页,过滤和排序搜寻,分页,过滤和排序等操作并不代表独自的端点。这些操作能够通过应用随API申请提供的查问参数来实现。 例如,让咱们检索按名称升序排列的所有作者。你的API申请应如下所示:api.com/authors?sort=name_asc。 此外,我想检索一个名称为“ Michiel”的作者。该申请看起来像这样 api.com/authors?search=Michiel。 ...

August 27, 2020 · 1 min · jiezi