了解应用于 REST 之上的 HTTP 知识 如果你想要构建设计优良的 REST API,了解一些关于 HTTP 协议的基础知识是很有帮助的,毕竟磨刀不误砍材工。...比如对于常见的提交表单,当遇到如下错误信息时: { "error": "Invalid payoad....当然可以,不过让我讲一个故事: 我曾经使用过一个 API,对于它返回的所有响应的状态码均是 200 OK,同时通过响应数据中的 status 字段来表示当前的请求是否成功,比如: {...不要嵌套资源 使用 REST API 获取资源数据,通常情况下会直接获取多个或者单个,但当我们需要获取相关联的资源时,该怎么做呢?...因此,你必须采取额外的步骤来实施 API 中的最佳实践,但大多数情况下,由于懒惰或者时间紧张等因素,意味着你不会投入过多精力在这些方面 —— 然后给你的用户提供了一个古怪的 API 端点。
所以,让我们只使用: GET: /books/:slug/bookCover/ 同样,对于创建新书的端点: #Don’t do this POST: /books/createNewBook/ #Do...利用查询字符串进行筛选和分页 大多数情况下,一个简单的端点无法满足各种复杂的业务场景。您的用户可能希望检索满足特定条件的项目,或者一次只检索少量数据以提高性能,这正是过滤和分页功能所设计的目标。...现在问题来了:如何将这样的功能融入REST API? 我的答案是:使用查询字符串(querystring)。 我认为使用查询字符串实现分页非常明显。它看起来像这样: GET: /books?...根据不同情况,以下是我的备忘单,用于了解我正在处理什么问题: 消费者没有提供身份验证凭据吗?他们的SSO令牌是否无效/超时? 401 未授权。...虽然我还没有创建资源(尚未),但这没问题。 有两个主要场景,我觉得202 Accepted特别适用: 如果资源将在未来处理后被创建 — 例如:在某个工作/流程完成之后。
那么一个精心设计的API有什么特点,为什么上面的JSON路由不是一个好的API路由呢? 该架构中,Dr。你可能听说过REST API。...一个给定的API是否符合REST规范的话题往往是REST“纯粹主义者”之间激烈冲突的源头,REST“纯粹主义者”认为REST API必须以非常明确的方式遵循全部六个特征,而不像REST“实用主义者”那样...Fielding和其他REST纯粹主义者对评判一个API是否是REST API有严格的规定,但软件行业在实际使用中引用REST是很常见的。...但是,与HTML和XML不同,通常用于API中资源表示的JSON格式没有定义包含链接的标准方式,因此您必须使用自定义结构,或者类似的JSON-API,HAL,JSON-LD这样的试图解决这种差异的JSON...服务器无法重置API客户端是Web浏览器,或者它可以处理重定向,则其可以渲染和处理HTML登录表单。
而这些数据绝大部分都是由 REST API 端点提供的,通俗地说:我们想要的数据存在于其他服务或数据库中,我们的应用程序查询该服务来检索数据,并根据自己的需要使用数据。...在过去,为了在连接 UI 以接受数据之前测试 REST API,通常必须通过终端的命令行查询 API,或者使用像 Insomnia 或 Postman 这样的 GUI(我在之前的博客中对它们进行了比较)...第一行末尾的 HTTP/1.1 与 RFC 2616 建立的标准有关,但是我不确定是否有必要,因此我将其保留只是为了安全。...DELETE 示例 经过我上面提供的其他例子,这个示例应该很简单 这个 DELETE 需要的查询参数是 username,这样它就知道到底要删除数据库中的哪个用户,而且还需要验证这个用户是否有资格提出这个请求...我希望你能考虑用 REST Client 来处理你未来可能需要做的任何 API 查询,我想你会对它能提供的愉快体验感到惊喜,不需要任何 API GUI。
一个基本的Node.js表单验证案例 假设你的 API 中有一个 Koa 或 Express Web 写的服务和一个端点,用于在数据库中创建包含多个字段的用户数据。...其中某些字段是必需的,有些字段只能具有特定值,或者必须格式化为正确的类型。...规则和过滤器的执行顺序与它们定义的顺序相同,所以如果你想要先切分含有空格的字符串,然后再检查它是否有值,则必须在 .trim() 之前定义 .required()。...立即开始编写更好的API 对于小型和大型API,我已经在好几个生产项目中用 datalize 进行 Node.js 表单验证。...如果很多人有兴趣的话,我也可以为此编写一个教程。 我希望本教程能够帮助你在 Node.js 中构建更好的API,并使用经过完美验证的数据,而不会出现安全问题或内部服务器错误。
这些 API 几乎都以 REST 为基础,有些地方是独一无二的。 REST 之所以流行,有许多理由可以解释。它易于理解、灵活、适用于各种规模,拥有庞大的社区,以及围绕其构建的各种工具。...我的意思是,这使得移动开发人员和前端开发人员有责任创建自己特别的 API,并且可以通过数据库进行查询。我不清楚你的想法,但是我觉得这个想法不是最好的主意。...这意味着你将在数据库创建一个新行,在某处写点什么,或者从无到有创造一些东西。...它也可以用于创建新的记录,但当时的设想是,客户端必须是一个 ID,为新的资源定义了一个 ID。所以,要让你的工作更加简单,在你需要更新一个资源时,请简单地使用 PUT。...对于其他许多人来说,旅程才刚刚开始。 有许多人只是等你把工作做完了再去干。要想让他们更好地工作,你就必须在很多方面对 API 进行充分的准备。
◈ describe_form 输出模型的表单定义,可以粘贴到 forms.py 文件中。(需要注意的是,这种方法创建的是普通 Django 表单,而不是模型表单。)...安装了 django-environ 之后,在项目的根目录创建一个 .env 文件,用这个文件去定义那些随环境不同而不同的变量,或者需要保密的变量。...(比如 API 密钥,是否启用调试,数据库的 URL 等) 然后,在项目的 settings.py 中引入 environ,并参考官方文档的例子[10]设置好 environ.PATH() 和 environ.Env...API 的用户界面按照 app 的维度展示了所有端点和可用方法,并列出了这些端点的可用操作,而且它提供了和 API 交互的功能(比如添加/删除/获取记录)。...django-rest-swagger 从 API 视图中的 docstrings 生成每个端点的文档,通过这种方法,为你的项目创建了一份 API 文档,这对你,对前端开发人员和用户都很有用。
在这篇文章中,我将带你了解创建 REST API 时需要遵循的一些最佳实践。这将帮助你创建最好的 API,并使你的 API 用户使用起来更容易。 0.什么是 REST API?...1.REST API 设计建议 1.用名词表示资源 当你设计一个 REST API 时,你不应该在端点路径中使用动词。端点应该使用名词,表示它们各自的作用。...创建:使用 POST 创建新的资源(非幂等)。 更新:使用 PUT 更新整个资源,PATCH 将部分修改应用于资源。PUT 和 PATCH 都是幂等的。...12.使用 HTTP 状态码 你应该在对你的 API 请求的响应中始终使用常规的 HTTP 状态代码。这将帮助你的用户知道发生了什么——请求是否成功,或者是否失败,或者其他情况。...文档应包含: API 的相关端点 端点的示例请求 在几种编程语言中的实现 不同错误的消息列表及其状态代码 你可以用于 API 文档的最常用工具是 Swagger。
REST 有太多的端点 但是这有什么问题呢?假设我们正在开发一个像 Facebook 这样的大型社交媒体应用,最终会得到很多端点,这意味着开发和维护这些 API 将花费更多的时间和精力。...现在随着越来越多的程序员用它构建 API,GraphQL 一直在快速增长。但是也有些人一直在问它是否真的要取代 REST,或者成为构建 API 的新方法。 ?...起初,我认为 GraphQL 是一个炒作,仅仅是创建 API 的另一种方式。但是当我开始研究它时,发现 GraphQL 具有为现代应用程序创建 API 所需的基本功能,因为它非常适合现今的技术栈。...结论 GraphQL 的确是API的未来,我们需要了解更多信息。这就是我决定撰写这一系列教程的原因,这些教程将为我们展示如何用好 GraphQL,先从查询和修改开始,然后是订阅和身份验证。...在本系列的下一篇教程中,我将深入研究 GraphQL,展示 GraphQL 如何与类型一起工作,并创建我们的第一个查询和修改。 所以请继续关注并希望在下一个教程中见到你!
权限控制的模型有许多种,比如RBAC(基于角色的权限控制),DAC(自由访问控制)等。虽然文档中解释的原则可以应用于各种模型,但我选择RBAC作为参考,因为它被广泛接受并且非常直观。...从客户的角度来看,这种耦合使得无法修改开发人员事先定义的角色集或者他们的权限,因为更改它意味着每次都必须编译和打包代码!这种用户体验也许不是我们的目标。...Rest是最佳选择 提取操作--举手之劳 REST接口肯定更好,或者至少是最容易匹配这个模型的。...设计良好的Rest服务通过标准的基于HTTP的API暴露资源和方法,资源通过URI定义,方法通过HTTP动词(如GET,PUT)等定义。...请求也是访问控制工具 REST服务处理传入请求,这意味着请求中找到的信息可用于制定访问控制决策。
虽然 Spring Boot 提供了用于检查字段是否为空的内置验证注释,但它没有提供用于检查唯一性的内置验证注释。在这种情况下,我们可以创建一个自定义验证注解来处理这种情况。...isValid()方法通过查询 PostRepository 来检查 title 是否为 null 或者它是否是唯一的。如果 title 为 null 或唯一,则验证成功,并返回 true。...假设我们有一个允许用户创建新帐户的 REST 端点。端点需要一个包含用户用户名和密码的 JSON 请求体。...4 提供有意义的错误信息 当验证失败时,必须提供清晰简洁的错误消息来描述出了什么问题以及如何修复它。 这是一个示例,如果我们有一个允许用户创建新用户的 RESTful API。...有了这个异常处理代码,我们的 REST API 抛出的任何验证错误都将被捕获并以结构化和有意义的格式返回给用户,从而更容易理解和解决问题。
对于基于浏览器的HTML5应用而言,Microsoft提供了主要的工具和框架,它们能够帮助你基于最新的标准创建可用于任何设备的应用程序。...开发者在使用Web API的时候应该关注OData和JSON,前者标准化了REST端点的暴露方式。...到现在为止,我们已经看到了用于WCF和Web API的OData,但是这并没有结束。...下面的指导方针并不适合数据驱动或者CRUD风格的应用程序,从事这种工作的开发者应该参照中小型企业指南。这些指导方针适用于有许多相互联系的部分同时有大量独立子系统的系统。...对于被识别出来作为关键任务的边界上下文,你可以使用更加昂贵的命令、查询职责分离(CQRS)或者领域驱动设计(DDD)模式以及完全的自动化测试。
我们可以说 GraphQL 其实根本就是:REST API 的接替者。所以让我回答一下你最有可能问的问题。 REST API 有什么问题? REST API 最大的问题是其多端点的本质。...上面提到的 REST API 的问题正是 GraphQL 试图要解决的问题。它们当然不是 REST API 的所有问题,我也不想讨论 REST API 是什么。...我主要讨论的是比较流行的基于资源的 HTTP 端点 API。这些 API 中的每一个最终都会变成一个具有常规 REST 端点 + 由于性能原因而制定的自定义特殊端点的组合。...要创建一个 GraphQL 模式,我们要定义具有类型的字段。这些类型可以是原语的或者自定义的,并且模式中的所有其他类型都需要类型。...对于简单的 RESTful API 端点逻辑,可以通过增强结构化的 SQL 查询来分析,检测和解决 N+1 问题。对于 GraphQL 动态解析的字段,就没那么简单了。
ServiceCollection ,用于注册服务,在和BlazorWebView进行绑定,将指定的html和BlazorWebView绑定以后在对于html内的id为 app 的元素进行Blazor...,你说 .NET 程序有问题找我能理解,Windows 崩溃找我,我也可以试试看,毕竟对 Windows 内核也知道一丢丢,那 Visual Studio 有问题找我就说不过去了,但又不好拒绝,就让朋友发下卡死的...Blazor Photino.Blazor Ubuntu 用于验证跨平台性,并且是否提高开发效率,Blazor和Photino一块使用的技术称为Blazor Hybrid。...打包 API创作 扩展了对最小 API 中表单绑定的支持 带有 .http 文件的 API 项目模板 原生AOT 使用编译时生成的最小 API 进行日志记录和异常处理 修剪 ASP.NET Core...https://goatreview.com/are-compiled-queries-efficient-efcore/ 关于 Entity Framework Core 的编译查询是否有效。
大家好,又见面了,我是你们的朋友全栈君。 本文大部分内容是针对Refit官网的翻译。...•UWP•Xamarin.Android•Xamarin.Mac•Xamarin.iOS•Desktop .NET 4.6.1•.NET Core .NET Core的注意事项: 对于.NET Core...API属性 基本用法 针对每个方法都必须提供一个HTTP属性,这个属性指定了请求的方式和相关的URL。这里有6种内置的批注:Get, Post, Put, Delete, Patch和Head。...Post 针对采用表单Post的API( 正文会被序列化成application/x-www-form-urlencoded ), 我们可以将指定参数的正文特性指定为BodySerializationMethod.UrlEncoded...这里程序会检查access token是否到期,并在需要时获取新的令牌。 分段上传 当一个接口方法被指定为[Multipart], 这意味着当前Api提交的内容中包含分段内容类型。
例如,对于在移动应用程序中使用的实际 api,原子资源的使用是次优的。再如,完全拒绝请求之间的数据存储实质上禁止了随处可见的“用户会话”机制。 不过,我想说,也没你想的那么糟糕!...REST API 规范能做什么? 尽管存在上面说到的缺点,但使用合理的方法,REST 仍然是创建真正优秀 api 的一个绝佳选择。...有许多用于序列化的插件:例如,sequealize-to-json。基本上,这些插件允许你为必须包含在 JSON 对象中的特定模型提供字段列表,以及附加规则。...使用单独的创建和编辑模型 通常,描述服务器响应的模型与描述用于 New 和 Update 模型的输入的模型不同。...基于客户端类型分离端点 通常,相同的端点会根据客户端类型或发送请求的用户角色返回不同的数据。例如,对于移动应用程序用户和后台管理人员来说,GET /uses 端点可能存在很大的不同。
你的保险公司必须获得关于你和你的车辆的信息,所以他们要求从汽车登记机构、信贷机构、银行和其他系统获得数据。所有这些都是实时透明地发生的,以确定保险公司是否能提供一个有竞争力的保单。...不同的HTTP方法可以在任何端点上使用,这些方法映射到应用程序的创建、读取、更新和删除(CRUD)操作: HTTP方法CRUD行为GET读取返回请求数据POST创建创建一个新记录PUT 或者 PATCH...200 OK用于成功的请求,尽管当记录被创建时也可以返回201 Created 。...REST API版本控制 API的变化是不可避免的,但端点的URL永远不应该失效,否则会破坏使用它们的应用程序。 为了避免兼容性问题,API通常是有版本的。...API作者需要满足的选项的数量可能会变得令人困惑。 GraphQL是否更好? REST的难题导致Facebook创建了GraphQL--一种网络服务查询语言。
如果 API 有了新的需求,我们可以轻松地添加另一个执行这个需求的端点:1)编写一个新函数,并将其放在一个新端点之后;2)现在,客户可以访问这个端点,并获取符合其需求的信息。 高性能。...在 RPC 中,无法对 API 进行检验总结,或者发送请求来开始理解根据需求应该调用哪个函数。 函数爆炸性增长。创建新函数非常容易。...在用于连接不需要查询灵活性的资源驱动型应用时,REST 是一种非常有效的方法。 GraphQL:仅请求所需要的数据 REST API 需要被多次调用才能返回所需要的资源。...具有强耦合性的 RPC 很适用于内部微服务,但它对外部 API 或者 API 服务而言不是一个好的选择。 SOAP 的使用有些麻烦,但它强大的安全拓展使它在计费操作、预订系统和支付方面是无可替代的。...归根结底,去针对一些小型的用例来尝试某种特定 API 架构,并去了解它是否适合你的用例以及是否解决了你的问题,这样做是比较合适的。如果它适用于你的用例,就可以尝试扩展并查看它是否适用于更多的用例。
如果 API 有了新的需求,我们可以轻松地添加另一个执行这个需求的端点:1)编写一个新函数,并将其放在一个新端点之后;2)现在,客户可以访问这个端点,并获取符合其需求的信息。 高性能。...在 RPC 中,无法对 API 进行检验总结,或者发送请求来开始理解根据需求应该调用哪个函数。 函数爆炸性增长。创建新函数非常容易。...在用于连接不需要查询灵活性的资源驱动型应用时,REST 是一种非常有效的方法。 4GraphQL:仅请求所需要的数据 REST API 需要被多次调用才能返回所需要的资源。...具有强耦合性的 RPC 很适用于内部微服务,但它对外部 API 或者 API 服务而言不是一个好的选择。 SOAP 的使用有些麻烦,但它强大的安全拓展使它在计费操作、预订系统和支付方面是无可替代的。...归根结底,去针对一些小型的用例来尝试某种特定 API 架构,并去了解它是否适合你的用例以及是否解决了你的问题,这样做是比较合适的。如果它适用于你的用例,就可以尝试扩展并查看它是否适用于更多的用例。
GraphQL 是一种用于 API 的查询语言,以及一个用于执行查询的服务器端运行时。它允许客户端精确地请求所需的数据,避免冗余和不足。...查询的结构通常反映了响应数据的结构,使数据要求明确且可预测。 变更(Mutation)变更是指在服务器上创建、更新或删除数据的 GraphQL 操作。...服务端复杂性服务端开发者可能需要花更多时间开发和维护数据模型,特别是对于复杂的业务逻辑。 缓存策略由于查询的动态特性,GraphQL API 的缓存可能更具挑战性。...GraphQL 与 REST API 的比较数据获取方式REST API 通常围绕资源设计,每个资源有不同的端点。客户端可能需要多次请求才能获取所需的所有数据。...这种方法要求客户端解析响应正文以确定请求是否成功,可能会使调试变得复杂。 实时数据REST 本身不支持实时更新。需要实现实时功能的应用通常必须采用其他技术,如长轮询或 WebSocket。
领取专属 10元无门槛券
手把手带您无忧上云