RESTful API 设计:使用 PUT 或 POST 创建多对多关系?

2024-04-14

在设计和创建 RESTful API 时,会出现以下问题:

该 API 支持 GET(用于查询)、POST(用于创建)、PUT(用于更新)和 DELETE(用于删除)。

假设数据库中有一个article and a shop两者都已经存在。

现在我们需要一个休息调用来将文章实例链接到商店实例。以下哪一个解决方案是最好/最简洁的 REST 设计:

  1. /shop/id/article/id/ --> 带 POST
  2. /shop/id/article/id/ --> 与 PUT
  3. /shoparticlerelation/ --> 带有 POST(主体中有 id 的对象)
  4. /shoparticlerelation/ --> with PUT(主体中有 id 的对象)

如果没有明确的答案或所有解决方案都同样好,如果有明确的论证原因,这也可能是一个有效的答案。


我想在这种情况下你已经收集了shops 和一个集合articles,而您只想将两个链接在一起。

一种选择是公开一个更多的数据库,例如提供此链接的“资源”,并进行类似的操作

POST /shopArticleLinks HTTP/1.1

{ "shop"  : xxx,
  "article: YYY
}

我个人希望将其作为更自然庄园中的商店和/或物品的财产进行公开,例如

PUT /shop/<ID> HTTP/1.1

{ /* existing details */
  "articles": [ /* list of articles */ ]
}

我在那里使用了 JSON,但当然可以使用您想要使用的任何格式。正如您所说,我也坚持使用 PUT,但请记住,使用 PUT,您应该发送新修改版本的完整替换,PATCH 可用于发送部分更新,但您需要考虑如何做那,可能会像

PATCH /shops/<ID>/articleLinks HTTP/1.1

{ "add"   : [],
  "remove : []
}

别忘了服务器端你可以看看什么articles被引用并确保它们有正确的后向指针。


Additional thoughts

关于第二种方法,您将链接公开为shop and/or article资源。请记住,当您更新给定的链接时,这是完全可以接受的(并且在这种情况下相当合适)shop相应的链接articles也更新了。

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

RESTful API 设计:使用 PUT 或 POST 创建多对多关系? 的相关文章

  • Ionic 3 Uncaught(承诺):[object Object]

    我是 Ionic 3 和移动开发的新手 我正在尝试将 MySQL DB 连接到我的 Ionic 应用程序和 PHP Restful API 我用 Postman 测试了 API 它工作得很好 为了在 Ionic 中实现它 我做了以下操作 我
  • Perl:读取网页文本文件并“打开”它

    我正在尝试创建一个脚本来读取文本文件 然后分析它们 无论文本文件是在线还是离线 离线部分完成 使用 open FILENAME anyfilename txt analyze file sub analyze file while
  • HttpURLConnection (java.net.CookieManager) 和 WebView (android.webkit.CookieManager) 之间的 cookie 双向同步

    不幸的是 Android 有很多 cookie 管理器 饼干为HttpURLConnection由以下人员维护java net CookieManager和饼干WebView由以下人员维护android webkit CookieManag
  • 如何在我的 gstreamer 中启用 httpsrc 插件?

    我尝试使用以下命令播放通过 http 检索的 mp3 文件或流 gst launch httpsrc location http domain com music mp3 mad osssink 但出现以下错误 ERREUR le pipe
  • 检查 Javascript 中的 URL 是否损坏

    这个问题之前已经发布在 Stack 上 但没有一个具体到我想要理解的内容 检查 URL 是否正确的最简单方法是发送 http Head 请求 但是如何使用它来指定 URL 呢 我在之前的帖子中发现了这一点 function UrlExist
  • 检测用户是否位于代理后面

    我试图弄清楚如何检测登录我网站的人是否在代理后面 我读到您可以通过可嵌入对象 Flash 和 Java 检测一个人的真实 IP 地址 但是 我实际上无法找到任何示例或来源 我正在使用 PHP 并且我已经阅读了寻找 SERVER HTTP X
  • gradle - 从 url 下载并解压文件

    从 url 下载和解压文件的正确 gradle 方法是什么 http 如果可能的话 我想防止每次运行任务时重新下载 在ant get可以通过以下方式实现skipexisting true 我当前的解决方案是 task foo ant get
  • 创建 JSON 对象并将其转换为 Java 中的 String

    我需要通过 http post 发送一个相当长的 JSON 标头 在Python中是这样的 self body header client self client name clientRevision self client versio
  • 增加 Instagram API 350 个请求限制

    根据开发人员文档 客户端每小时可以发出 5000 个请求 但目前我的应用程序被限制为每小时 350 个请求 我收到的错误代码是 400 消息是 已超出每小时最大请求数 您在过去一小时内发出了 XXX 个请求 超过了允许的 350 个请求 您
  • Rails 使用驼峰命名法渲染 json 对象

    我在简单的 Rails API 中有以下控制器代码 class Api V1 AccountsController lt ApplicationController def index render json Account all end
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • 在 Angular 中一起使用 Promise 和服务

    我的问题是基于这个话题 https groups google com forum msg angular qagzXXhS VI p9ArYjfivW8J在 Angular 谷歌小组中 我想提供一个服务 存储通过 http 从后端检索的一
  • 在 ASP.net 中使用 NVP API 时 Paypal SetExpressCheckout 出现问题

    Hi 我正在实现 Facebook 游戏和 Paypal 快速结账支付服务之间的集成 我的网站是在 ASP net 中开发的 我使用 NVP API 进行集成 我的问题是我不断收到 10400 错误 订单总计丢失 我的代码是 Set the
  • 使用 REST API 进行正确的会话管理

    我已经完成了 RESTful API 的设计 其中我使用作为参数发送的 API 令牌对每个请求进行身份验证 现在我想创建一个客户端界面 我想知道什么是管理每个客户端的会话的正确安全方法browser客户 我想过一个流程来保持服务器端无状态
  • 使用 Chrome TTS 的 SSML

    我试图通过强调等方式让 TTS 句子更加清晰 我正在使用Chrome TTS API http developer chrome com extensions tts html 这表明它接受SSML 格式的文档 http www w3 or
  • Ember 模型中的自定义请求 url

    我正在尝试将 Ember 数据与已构建的 REST api 一起使用 它适用于顶级路由 例如我在 api 端有课程路由 如下所示 app get courses app controllers courses findAll app get
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • Postman如何发送请求? ajax,同源策略

    我发现了这个非常有用的 Chrome 扩展程序 名为 Postman 这是一个非常有用的扩展 特别是当您正在编写 RESTful 应用程序时 我感到困惑的一件事是这个插件 扩展如何能够在不同的域上成功发送 POST 请求 我尝试像这样使用
  • 获取发送 cURL 请求的用户的 IP 地址

    我想获取使用 php 中的 cURL POST 方法向我的服务器发送请求的用户的 IP 地址 我正在开发一个 Flight API 我将使用 cURL POST 方法获取请求 我必须获取客户端的 IP 地址并验证他的 IP 地址是否可用 如
  • htaccess 重定向非 www http 和 https

    我想要 http example com重定向至 http www example com https example com重定向至 https www example com 以及任何东西http whatever example co

随机推荐

  • vis.js时间线如何将鼠标悬停事件添加到vis-item box-box

    我使用 vis js 创建了一个时间线图表 我有很多可见盒物品 因为我可以在时间线上显示非常有限的信息 因此 我想当用户移动到项目上时显示该项目的详细信息 我在此网址查看时间线事件的文档http visjs org docs timelin
  • 如何使用同一个应用程序制作导航抽屉和底部导航?

    我正在尝试在我的应用程序中使用导航抽屉和底部栏导航 因此我首先创建了导航活动 然后我尝试将底部栏导航添加到同一活动 我想开发这样的应用程序 Activity xml 中没有 BottomNavigationView 应用程序可以正常工作 但
  • 使用长按手势对表格视图中的单元格重新排序?

    我希望能够使用长按手势 而不是使用标准重新排序控件 对表格视图单元格重新排序 识别长按后 我希望 tableView 实质上进入 编辑模式 然后重新排序 就像我使用 Apple 提供的重新排序控件一样 有没有一种方法可以在不需要依赖第三方解
  • Python - 检查用户是否具有管理员权限

    我正在用 Python 3 x 编写一个小程序作为自学项目 我的想法是让程序允许用户输入两个文本字段 然后将用户的输入插入到两个特定注册表项的值中 有没有一种简单的方法来检查当前用户是否可以访问注册表 我宁愿它清楚地告诉用户他 她需要管理员
  • 快速选择所有带有css背景图片的元素

    我想抓取页面上具有 css 背景图像的所有元素 我可以通过过滤函数来做到这一点 但在包含许多元素的页面上速度非常慢 filter function return this css background image addClass bg f
  • 在python 2.7中使用for循环创建多个数据帧

    我有一个位置列表 HOME Office SHOPPING 和一个 pandas 数据框 DF Start Location End Location Date OFFICE HOME 3 Apr 15 OFFICE HOME 3 Apr
  • iOS 获取代理设置

    在我的项目中 我使用 libcurl 通过互联网下载数据 问题是 libcurl 无法检测 wifi 连接的代理设置 我必须手动设置 libcurl 的设置 所以我想知道如何获取 wifi 连接的代理设置 我在钥匙串中找到了一些有关信息的线
  • 邮件程序错误缺少模板

    Hello 我有问题行动邮递员 当我尝试执行操作时 rake send email 我收到一个错误 rake aborted ActionView MissingTemplate Missing template user mailer m
  • 使用 PHP 从 S3 获取视频并上传到 YouTube

    我有一些代码可以将视频文件上传到 YouTube yt new Zend Gdata YouTube httpClient create a new VideoEntry object myVideoEntry new Zend Gdata
  • 在增强for循环中使用final for循环变量的目的是什么?

    我理解下面的声明是如何工作的 for final Animal animal animalList do some function 但是这里使用final关键字的目的是什么 这样做有两个可能的原因 它可能只是避免在循环体中意外更改循环变量
  • 对象创建定义属性设置器

    我需要做到这一点 以便每次更改对象上的特定属性时 它都会调用同一对象上的特殊方法 Example MyObject prototype Object create specialMethod function someValue set f
  • 为什么“try”是一个明确的关键字?

    在我所知道的所有异常感知语言 C Java C Python Delphi Pascal PHP 中 捕获异常需要显式try块后跟catch块 我经常想知道其技术原因是什么 为什么我们不能直接追加catch普通代码块的子句 作为一个C 的例
  • 添加从 Unity for Android studio 导出的 2 个模块出现错误:“错误:程序类型已存在:bitter.jnibridge.JNIBridge”

    我在 Android Studio 中的 Kotlin 中有一个 android 项目 以及 2 个 Unity 模块 像使用 Unity 的 android studio 的项目一样导出 我想在我的项目中使用它们 但我收到错误 错误 程序
  • 最大非空列

    我需要使用基于两个 DATETIME 列的最大值的公式更新一行 我通常会这样做 GREATEST date one date two 但是 两列都允许为 NULL 即使另一个为 NULL 我也需要最大的日期 当然 当两者都为 NULL 时
  • JSON 文件中数据的所有可能组合

    我的目标是创建一部分代码 该部分代码将使用 JSON 文件中的数据生成所有可能的组合 而不会重复 具有相同元素的组合 无论其顺序是什么 我的 JSON 文件如下所示 COLLECTION Assault WEAPON SG 553 SKIN
  • 如何在 Hive 中将字符串转换为毫秒时间戳

    我有一个字符串 20141014123456789 它代表一个毫秒时间戳 我需要将其转换为 Hive 中的时间戳 0 13 0 而不丢失毫秒 我尝试了这个 但 unix timestamp 返回一个整数 所以我丢失了毫秒 from unix
  • jQuery Ajax 调用返回“[object XMLDocument]”

    我有一个 HTML 页面 我想使用 Ajax 填充该页面 我已经从其他页面复制了代码 这些都是 PHP 语言 我不确定这是否重要 并且它正在返回 object XMLDocument 在其他页面 PHP 页面 中 我得到了在例程中打印出来的
  • 使用 apriori 算法进行推荐

    So a 最近的问题 https stackoverflow com questions 1248373 apriori algorithm让我意识到相当酷先验算法 http en wikipedia org wiki Apriori al
  • 好吧,我们可以在 javascript 中拥有私有标识符,但是受保护的标识符又如何呢?

    就这么简单 我们能以某种方式模拟 Javascript 中的 受保护 可见性吗 Do this Note Do not break touch this object code 或者通过谷歌在第一页找到这个 http blog blanqu
  • RESTful API 设计:使用 PUT 或 POST 创建多对多关系?

    在设计和创建 RESTful API 时 会出现以下问题 该 API 支持 GET 用于查询 POST 用于创建 PUT 用于更新 和 DELETE 用于删除 假设数据库中有一个article and a shop两者都已经存在 现在我们需