RESTful API 和批量操作

2024-01-09

我有一个中间层,它在共享数据库上执行 CRUD 操作。当我将产品转换为 .NET Core 时,我想我还会考虑使用 REST 作为 API,因为 CRUD 应该是它擅长的地方。看起来 REST 对于单条记录操作来说是一个很好的解决方案,但是当我想删除(比如说)1,000 条记录时会发生什么?

每个专业的多用户应用程序都会有一些乐观并发检查的概念:您不能让一个用户在没有反馈的情况下消除另一个用户的工作。据我了解,REST 使用 HTTP ETag 标头记录来处理此问题。如果客户端发送的 ETag 与服务器的标签不匹配,那么您发出412 前提条件失败。到目前为止,一切都很好。但是当我想删除1000条记录时该怎么办呢? 1,000 个单独调用的来回时间相当长,那么 REST 如何处理涉及到的批处理操作乐观并发?


REST 的重点是资源以及客户端与服务器的解耦,但它不是简单的 CRUD 架构或协议。虽然 CRUD 和 REST 看起来非常相似,但通过 REST 原则管理资源通常也会有副作用 https://softwareengineering.stackexchange.com/questions/120716/difference-between-rest-and-crud。因此,将 REST 描述为简单的 CRUD 事物过于简单化了。

关于 REST 资源的批处理,底层协议(最常见的是 HTTP)确实定义了可以使用的功能。 HTTP 定义了一些可用于修改多个资源的操作。

POST是该协议的万能瑞士军刀,可用于根据您的喜好管理资源。由于语义是由开发人员定义的,因此您可以使用它一次创建、更新或删除多个资源。

PUT具有用请求的有效负载主体替换给定 URI 处可获取的资源状态的语义。如果您发送一个PUT请求“列表”资源并且有效负载定义条目列表,您也可以实现批量操作。

POST 和 PUT 方法之间的根本区别是 通过所附表示的不同意图来突出显示。 POST 请求中的目标资源旨在处理 根据资源自身语义的封闭表示, 而 PUT 请求中的封闭表示定义为 替换目标资源的状态。

...

应用于目标资源的 PUT 请求可能会对 其他资源。例如,一篇文章可能有一个 URI 识别与以下版本不同的“当前版本”(资源) 标识每个特定版本的 URI(在某一时刻与当前版本共享相同状态的不同资源) 资源)。对“当前版本”URI 的成功 PUT 请求 因此,除了更改之外,还可能创建一个新版本资源 目标资源的状态,也可能导致链接 在相关资源之间添加。 (Source https://www.rfc-editor.org/rfc/rfc7231#section-4.3.4)

PATCH (RFC 5789 https://www.rfc-editor.org/rfc/rfc5789)尚未包含在 HTTP 协议中,尽管有很多框架支持。它主要用于一次更改多个资源或对资源执行部分更新,这PUT如果更新的部分是其他资源的子资源,也可以实现;在这种情况下,它会对外部资源产生部分更新的影响。

重要的是要知道PATCH请求包含服务器必须完成的将资源转换为其预期状态的必要步骤。因此,客户端必须获取当前状态并提前计算转换所需的必要步骤。关于这个主题的一篇内容非常丰富的博客文章是不要像白痴一样打补丁 http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/. Here JSON 补丁 http://jsonpatch.com/ (RFC https://www.rfc-editor.org/rfc/rfc6902) 是一种基于 JSON 的媒体类型,可以清晰地可视化 PATCH 概念。必须完全应用补丁请求(补丁请求中定义的每个操作)或根本不应用。因此,它需要事务范围的处理和回滚,以防任何操作失败。

有条件的请求,例如ETag and IfModifiedSince标头定义在RFC 7232 https://www.rfc-editor.org/rfc/rfc7232仅当请求应用于最新版本的资源时,才可以在 HTTP 请求中使用它来执行修改,因此与(分布式)数据库中的乐观锁定相关。

到目前为止,一切都很好。但是当我想删除1000条记录时该怎么办呢?

这取决于您将使用什么框架。如果支持的话PATCH我明确投票支持PATCH。如果没有,您使用起来可能会更安全POST than PUT作为非常严格的语义PUT已经,因为语义由您明确定义。如果是批量删除,PUT还可以通过将集合资源定位为空主体来使用,其结果是删除集合中的任何项目,从而清除整个集合。如果有些物品应该保留在收藏中,PATCH or POST可能更容易使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RESTful API 和批量操作 的相关文章

  • XML-RPC 与 REST

    我打算在这里构建一个小型服务器 并想为其创建一个 API 我正在决定什么是更好的并且已经排除了SOAP因为在我看来那件事是一团糟 我只剩下REST and XML RPC 我真的很喜欢XML RPC 它实现起来非常简单 并且足够常规 所有客
  • 将 HttpApi 与 I/O 完成端口结合使用

    我刚刚偶然发现了微软的HTTP 服务器 API http msdn microsoft com en us library aa364510 28v vs 85 29 aspx 简介中写道 HTTP 服务器 API 使应用程序能够通过 HT
  • 我应该使用多个 HttpClient 来进行批量异步 GET 请求吗?

    我有一个场景 我需要在尽可能短的时间内发出大量 GET 请求 想想大约 1000 个 我知道通常最好保留一个客户端并尽可能重用它 Create Single HTTP Client HttpClient client new HttpCli
  • 如何增加asp classic的请求接受限制

    我从java小程序向asp classic发送post请求 我在此请求中发送非常大的数据 即 csv 数据 当此请求中的字符数增加并超过 138000 时 asp 不接受该请求 java 小程序给出 500 错误 所以有人可以告诉我如何才能
  • 根据客户端发送 HTML 或 JSON 响应

    我有一个带有 Eloquent 实体及其各自的 Laravel 应用程序RESTful 资源控制器 http laravel com docs 5 0 controllers restful resource controllers 如下所
  • Web API 的 ASP.NET MVC Core 控制器 PATCH 方法

    给定一个数据库表 Person 包含 3 列 Id 名字和姓氏 使用真实的 DbContext 时 ASP NET Core Web API MVC 控制器方法 PATCH 仅修改姓氏 看起来如何 我根本不知道如何实现它 并且找不到相关教程
  • RestSharp RestClient的默认超时值是多少?

    任何人都知道默认超时值休息锐利 https github com restsharp 休息客户端 RestSharp 在底层使用 HttpWebRequest 它有一个默认超时 https msdn microsoft com en us
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • REST - 复杂的应用程序

    我正在努力将 RESTful 原则应用到我正在开发的新 Web 应用程序中 特别是 为了实现 RESTful 每个 HTTP 请求本身都应该携带足够的信息 以便其接收者对其进行处理 从而与 HTTP 的无状态性质完全一致 该应用程序允许用户
  • AJAX 发送数据到 Node.js 服务器

    我尝试使用 AJAX 将数据发送到 Node js 服务器 但不断遇到同样的问题 即接收问题 这是客户端 JavaScript AJAX 代码 var objects function return new XMLHttpRequest f
  • 诸如用于测试 HTTP 请求的虚拟 REST 服务器之类的东西? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在四处寻找 但找不到任何这样的网站 我想知道是否有一些虚拟服务器可以响应测试 GET 请求并返回
  • $http.get() 与 JSON 数据

    我正在编写一个服务器应用程序 并希望客户端使用正文中的数据来参数化我的 GET 方法 如下所示 http v GET http localhost 3000 url text 123 foo bar GET url HTTP 1 1 Acc
  • Ruby on Rails REST 设计问题 - 在账户之间转账

    我有一个 Account 类 想要实现转账屏幕以允许用户在 2 个账户之间转账 我将如何实现这种 RESTful 方式 我有标准帐户和休息操作 那很好 但我该如何实现转移呢 通常我只会向帐户控制器和相应的视图添加一个名为 transfer
  • JS 库请求的常见 HTTP 标头是什么?

    使用JavaScript 框架原型 http www prototypejs org 我注意到 Ajax 请求通过一个名为X Requested With 其他 JavaScript 库 如 jQuery dojo 和 YUI 是否会向其
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • 使用 Spring 的 REST 多部分混合请求(文件+json)

    我需要将一个文件和一个 json 一起发送到我的 Spring 控制器 我有以下控制器类 Controller RequestMapping perform public class PerformController RequestMap
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 使用嵌套的 hashmap 参数发送 volley 请求

    我正在使用 android volley 框架向我的服务器发送 jsonobject 请求 get 请求工作正常 现在我想发送一个带有请求参数的 post 请求 该请求参数是嵌套的 hashmap 我重写 getparams 方法 但它期望
  • Flutter http请求上传mp3文件

    我使用这个 api 上传 mp3 文件 使用这种方法 Future
  • Django REST Framework:何时创建超链接资源以及何时创建嵌套资源?如何发布嵌套资源?

    我正在使用 Django REST 框架构建 REST Web API 事情进展顺利 但我偶然发现了嵌套资源的问题 起初 REST API 中的所有关系都是超链接的 例如 一篇文章看起来像这样 path http api myproject

随机推荐

  • 如何防止对象数字属性自动排序?

    为什么我遇到这个问题 我试图解决一个算法问题 我需要返回数组中出现次数最多的数字 像 5 4 3 2 1 1 应该返回 1 而且 当两个数字与最大出现次数同时出现时 第一个出现 像 5 5 2 2 1 返回5因为5首先出现 我使用一个对象来
  • 使用 PHP 操作 XML

    我有一个如下所示的 XML 文件
  • 从 URL 获取图像并将其转换为 base64 字符串 - Flutter

    我有一个包含 5 个图像 url 的字符串数组 我正在寻找一种方法从 url 获取图像 然后将图像编码为 base64 字符串 最后将其插入到另一个数组中 该解决方案应该适用于 Flutter 中的移动设备和 Web 我正在寻找解决方案 并
  • Rails 中的 add_foreign_key 与 add_reference

    有什么区别 添加外键 and 添加参考 Rails 中的方法 根据rails官方指南 我所了解的是它们都用于在两个表之间创建外键约束 add foreign key 添加新的外键 from table是带有键列的表 to table包含引用
  • 启动 Node.js 服务器时 Ansible 挂起

    我想在 ansible playbook 中启动我的 node js 应用程序 现在 最终指令如下所示 name start node server shell chdir app path npm start 问题是 ansible 永远
  • 是什么导致“用户代理样式表”使用“border-box”而不是“content-box”来调整框大小?

    我的印象是 Safari Chrome 和 Firefox 等浏览器中的用户代理样式表是浏览器内部的内容 无法直接修改 而是需要覆盖样式属性 由于包括 Mozilla 在内的各种网站 我也有这样的印象 盒子尺寸Webkit 和 Mozill
  • 如何在 google dataproc 上运行 Spark 3.2.0?

    目前 google dataproc 没有 Spark 3 2 0 作为图像 最新可用的是 3 1 2 我想使用 Spark 随 3 2 0 发布的 pandas on pyspark 功能 我正在执行以下步骤来使用 Spark 3 2 0
  • Spring Tool Suite 4:如何关闭 Spring Boot Language Server 输出到控制台窗口?

    不知何故 我已经为 Spring Boot 语言服务器 1 和 2 打开了日志记录 令人讨厌的是 当它登录到控制台窗口时 所有其他控制台似乎都被删除了 例如 如果我对一个项目进行运行 测试并获得一堆控制台输出 然后尝试编辑一些代码 我有时会
  • Java Swing - 在选择子菜单中的项目时添加宽大处理

    当尝试单击子菜单中的某个项目时 很自然地会快速将鼠标滑过其下方的菜单项 Windows 和 Mac 本身都通过在打开菜单之前放置 一小段延迟来处理此问题 Swing JMenus 不处理此问题 并且在鼠标到达预期的菜单项之前 鼠标短暂悬停的
  • 如何使用 EF 6 设置 WCF 数据服务 (odata) 的配置文件

    我已启动并运行数据服务 但收到此错误 远程服务器返回错误 413 请求实体太大 我尝试了很多方法来解决这个问题 但没有成功 我已将网站上的 uploadReadAheadSize 和 IIS 中的数据服务设置为最大设置 我还尝试了许多不同的
  • dayjs 未正确转换时区

    我正在尝试将日期从当地时间 台北 UTC 8 转换为洛杉矶 UTC 7 然而dayjs转换似乎完全关闭 dayjs 2020 09 21 20 30 tz Asia Taipei 这导致2020 年 9 月 22 日星期二 05 30 00
  • Postgrex - 主机“xxx.xxx.xxx.xxx”没有 pg_hba.conf 条目

    我有一个单独托管的 Postgres 数据库 我试图将其与我的 Phoenix 应用程序一起使用 我的prod配置是 config my app MyApp Repo adapter Ecto Adapters Postgres url p
  • 如何比较[32]byte和[]byte?

    我想比较输出sha256 Sum256 这是 32 byte with a byte 我收到错误 类型 32 byte 和 byte 不匹配 我无法转换 byte to 32 byte 有没有办法做到这一点 您可以通过切片将任何数组 siz
  • 如何编写代码来自动完成单词和句子?

    我想编写在 Linux 终端中自动完成的代码 该代码应按如下方式工作 它有一个字符串列表 例如 你好 嗨 你好吗 再见 太好了 在终端中 用户将开始输入 当存在某种匹配可能性时 他会得到可能字符串的提示 他可以从中进行选择 类似于vim编辑
  • 在移动设备上禁用固定视口大小的缩放

    我正在尝试禁用移动设备上的缩放 我知道这段代码会起作用 但就我而言 我无法选择使用 width device width 我必须将视口大小设置为 480px 所以我使用以下代码 但我在移动设备上获得了页面的放大视图 并且可以将其缩小 使用
  • R cor.test:“有限观察不足”

    我目前正在尝试创建一个 R 函数 计算指定列与数据帧的所有数字列的 corr test 相关性 这是我的代码 function returning only numeric columns only num lt function data
  • 使用 Spring Batch 从 Oracle DB 读取数据时如何阻止连接关闭?

    我有一个带有 Spring boot 应用程序的 Spring Batch 其中我从外部 Oracle DB 读取数据并将其写入生产环境中的 SQL Server 我在读取数据之前验证连接 但即使这样也会出现 关闭连接 问题 有人知道这个问
  • 将空格、%20 和 + 替换为连字符 [重复]

    这个问题在这里已经有答案了 可能的重复 301 带空格重定向 https stackoverflow com questions 5821120 301 redirect with spaces 现在我将每个图像重定向到包含该图像的 htm
  • 更改 p12 文件的密码

    我从客户端转发了带有推送证书的 p12 文件 我可以更改此 p12 文件的密码吗 如果可以 我可以使用如下内容 openssl pkcs12 in Certificates p12 out temp pem passin pass pass
  • RESTful API 和批量操作

    我有一个中间层 它在共享数据库上执行 CRUD 操作 当我将产品转换为 NET Core 时 我想我还会考虑使用 REST 作为 API 因为 CRUD 应该是它擅长的地方 看起来 REST 对于单条记录操作来说是一个很好的解决方案 但是当