REST 复杂/复合/嵌套资源 [关闭]

2023-11-28

我正在尝试解决基于 REST 的 API 中的概念的最佳方法。不包含其他资源的扁平资源没有问题。我遇到麻烦的是复杂的资源。

例如,我有一本漫画书的资源。ComicBook上面有各种各样的属性,比如author, issue number, date, etc.

一本漫画书也有一个列表1..n盖子。这些封面是复杂的物体。它们包含有关封面的大量信息:艺术家、日期,甚至封面的 Base 64 编码图像。

For a GET on ComicBook我可以退回漫画和所有封面,包括经过 Base64 处理的图像。对于获得一部漫画来说,这可能不是什么大问题。但是假设我正在构建一个客户端应用程序,想要在表格中列出系统中的所有漫画。
该表将包含一些属性ComicBook资源,但我们当然不想显示表中的所有封面。返回 1000 本漫画书,每本都有多个封面,会导致通过网络传输大量数据,在这种情况下,这些数据对于最终用户来说是不需要的。

我的本能是让Cover资源并拥有ComicBook包含封面。所以现在Cover是一个 URI。GET现在漫画书上的作品,而不是巨大的Cover我们为每个封面发回一个 URI,客户端可以根据需要检索封面资源。

现在我在创作新漫画时遇到了问题。当然,当我创建一个封面时,我会想要创建至少一个封面Comic,事实上这可能是一个商业规则。
所以现在我陷入困境,我要么通过首先提交一个来强制客户执行业务规则Cover,获取该封面的 URI,然后POSTing a ComicBook列表中包含该 URI,或者我的POST on ComicBook接收的资源与吐出的资源看起来不同。传入的资源为POST and GET是深拷贝,其中传出GETs 包含对依赖资源的引用。

The Cover在任何情况下,资源可能都是必要的,因为我确信作为客户,我希望在某些情况下解决涵盖方向的问题。因此,无论依赖资源的大小如何,该问题都以一般形式存在。一般来说,如何在不强迫客户端“知道”这些资源是如何组成的情况下处理复杂的资源?


@ray,精彩的讨论

@jgerman,不要忘记,仅仅因为它是 REST,并不意味着资源必须从 POST 中固定下来。

您选择在资源的任何给定表示中包含什么内容取决于您。

您单独引用的封面的情况仅仅是创建其子资源(封面)可以交叉引用的父资源(漫画书)。例如,您可能还希望分别提供对作者、出版商、人物或类别的引用。您可能希望单独创建这些资源,或者在漫画书引用它们作为子资源之前创建这些资源。或者,您可能希望在创建父资源时创建新的子资源。

您的封面的具体情况稍微复杂一些,因为封面确实需要漫画书,反之亦然。

但是,如果您将电子邮件视为资源,并将发件人地址视为子资源,则显然您仍然可以单独引用发件人地址。例如,获取所有来自地址。或者,使用之前的发件人地址创建一条新邮件。如果电子邮件是 REST,您可以轻松地看到许多可用的交叉引用资源:/received-messages、/draft-messages、/from-addresses、/to-addresses、/addresses、/subjects、/attachments、/folders 、/标签、/类别、/标签等。

本教程提供了交叉引用资源的一个很好的示例。http://www.peej.co.uk/articles/restful-delicious.html

这是自动生成数据的最常见模式。例如,您不必发布新资源的 URI、ID 或创建日期,因为这些是由服务器生成的。然而,当您取回新资源时,您可以检索 URI、ID 或创建日期。

二进制数据的例子。例如,您想要将二进制数据作为子资源发布。当您获取父资源时,您可以将这些子资源表示为相同的二进制数据,或者表示为表示二进制数据的 URI。

表单和参数已经不同于资源的 HTML 表示形式。发布一个生成 URL 的二进制/文件参数并不困难。

当您获取新资源的表单 (/comic-books/new) 或获取编辑资源的表单 (/comic-books/0/edit) 时,您需要的是该资源的特定于表单的表示形式。如果您将其发布到内容类型为“application/x-www-form-urlencoded”或“multipart/form-data”的资源集合,则您要求服务器保存该类型表示。服务器可以使用保存的 HTML 表示形式或其他内容进行响应。

您可能还希望允许将 HTML、XML 或 JSON 表示形式发布到资源集合,以用于 API 或类似用途。

还可以按照您的描述来表示您的资源和工作流程,考虑到漫画书之后发布的封面,但要求漫画书有封面。示例如下。

  • 允许延迟封面创建
  • 允许创作具有所需封面的漫画书
  • 允许交叉引用封面
  • 允许多个封面
  • 创建漫画草稿
  • 创建漫画书封面草稿
  • 出版漫画草稿

获取/漫画书
=> 200 OK,获取所有漫画书。

获取/漫画书/0
=> 200 OK,获取带封面的漫画书(id:0)(/covers/1,/covers/2)。

获取/漫画书/0/封面
=> 200 OK,获取漫画书封面(id:0)。

获取/封面
=> 200 好的,获取所有封面。

获取/封面/1
=> 200 好的,获取漫画书 (/comic-books/0) 的封面 (id: 1)。

GET /漫画书/新
=> 200 OK,获取创建漫画书的表单(表单:POST /draft-comic-books)。

POST /草稿漫画书
标题=foo
作者=嘘
出版商=咕
发表=2011-01-01
=> 302 找到,位置:/draft-comic-books/3,重定向到带有封面的漫画草稿(id:3)(二进制)。

获取/草稿漫画书/3
=> 200 OK,获取带有封面的漫画草稿(id:3)。

获取 /draft-comic-books/3/covers
=> 200 好的,获取漫画草稿的封面 (/draft-comic-book/3)。

获取 /draft-comic-books/3/covers/new
=> 200 OK,获取为漫画草稿(/draft-comic-book/3)创建封面的表单(形式:POST /draft-comic-books/3/covers)。

发布 /draft-comic-books/3/covers
cover_type=正面
cover_data=(二进制)
=> 302 找到,位置:/draft-comic-books/3/covers,重定向到漫画草稿的新封面 (/draft-comic-book/3/covers/1)。

获取/草稿漫画书/3/发布
=> 200 OK,获取发布漫画草稿的表单(id:3)(表单:POST /published-comic-books)。

POST /出版的漫画书
标题=foo
作者=嘘
出版商=咕
发表=2011-01-01
cover_type=正面
cover_data=(二进制)
=> 302 找到,位置:/comic-books/3,重定向到已出版的漫画书(id:3)带封面。

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

REST 复杂/复合/嵌套资源 [关闭] 的相关文章

  • Android:如何在多语言资源中重用字符串

    自从我的第一个 Android 项目以来 这个问题一直困扰着我 考虑以 en 作为默认值的多语言字符串资源 res values strings xml lt The default language en res values de st
  • Marklogic REST API 搜索最新文档版本

    我们需要使用 Marklogic 的 REST API 将 MarkLogic 搜索限制为托管文档的最新版本 我们正在使用 MarkLogic 6 使用直接 xquery 您可以使用dls documents query 作为附加查询选项
  • 预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Origin

    当我尝试加载网页时 出现以下错误 预检响应中的 Access Control Allow Headers 不允许请求标头字段 Access Control Allow Origin 我查看了针对此问题的其他答案 它们表明缺乏 CORS 支持
  • 使用 Facebook 进行身份验证的网站的 REST API

    我们有一个网站 其中only登录网站并进行身份验证的方式是使用 Facebook 这不是我的选择 当您第一次登录 Facebook 时 系统会自动为您创建一个帐户 现在 我们希望为我们的网站创建一个 iPhone 应用程序 并为其他人使用我
  • 当我有自定义身份验证模型时,如何登录 Django Rest 可浏览 API?

    我有一个自定义用户模型 如下所示account models py from django contrib auth modles import AbstractUser from django db models signals impo
  • 如何使用类路径位置

    为了解决这个问题 我到处寻找 但找不到解决方案 问题如下 我在 Tomcat 7 服务器上构建了一个 Spring mvc web 应用程序 准确地说是 7 0 12 并且我在获取
  • 将 REST 服务与 Android 应用程序同步

    我使用一个 REST 服务来填充数据库中的信息 稍后由我的应用程序使用 我已经阅读了有关此事的多个主题 现在必须决定如何在 REST 服务和数据库之间实现同步 想象一个应用程序 它从谷歌金融 API 获取有关股票的信息并将其存储在数据库中
  • ASP.NET MVC 4 Web Api 和 REST 经典服务之间的区别

    我看到了ASP Net MVC4 WebApi将服务公开为 Rest 服务 但实际上和正常有什么区别Rest and ASP Net MVC4 WebApi 我不确定你的意思normal Rest REST http en wikipedi
  • django-rest-swagger 与模型序列化器不能很好地配合吗?

    我已经离开了 django rest swagger 的文档github页面 https github com marcgibbons django rest swagger 更具体地说 是 它是如何工作的 部分 它表明您可以为其余 api
  • 从 Delphi 访问 TRAKT API - 承载身份验证问题

    使用 TOauth2Authenticator TRESTClient TRESTRequest TRESTResponseDataSet TRESTResponse TFDmemtable 和 TDataSource 我成功连接到 Tra
  • 为休息服务实施 JUnit 测试

    我必须为我的休息服务实现一些 JUnit 测试 例如 这是我的休息服务之一 Path dni fe public class HelloWorld POST Path home Consumes MediaType APPLICATION
  • RESTful 资源 - 接受对象列表

    我正在构建一个 RESTful 资源集合 其工作方式如下 我将使用 人 作为示例 GET people key returns a person object JSON GET people first name Bob returns a
  • WCF 4.0 REST 上传 MS-Excel 文件

    我正在尝试通过 WCF REST 服务上传 MS Excel 文件 我使用了下面帖子中给出的解决方案 RESTful WCF服务图片上传问题 https stackoverflow com questions 664712 restful
  • 泽西宁静例外

    我面对的是泽西岛 2 7 这是我的服务 package edu srv rest import javax ws rs GET import javax ws rs POST import javax ws rs Path import j
  • 使用 Swagger 的 Spring REST API 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以帮助我生成 RESTful API 文档的工具 我的服务器是用Java编写的并使用S
  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • REST API 路由最佳实践

    我想知道当订单是一种资源时 为以下场景创建 REST API 的最佳实践是什么 获取数据库中的所有订单 当然不是实际场景 仅供理解 通过订单ID获取订单 根据订单ID获取单个订单 单个 GET 路由是否可以用于所有这些场景 或者我们应该针对
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 有人可以用简单的术语解释“超文本作为应用程序状态的引擎”

    这似乎是我最难理解的 REST 原则 我知道 在设计 REST API 时 大部分精力应该花在为应用程序设计 描述超文本上 对于这个原理的现实世界应用有什么指示吗 原子协议如何应用这个原理 有人可以简单地解释一下如何将其应用到假设的购物车
  • 如果单个 POST 请求创建多个资源,是否被认为是 RESTful?

    我们有客户 API 它采用 customer name customer mobile customer email 并在数据库中创建客户 我们还有接受 productId customer name customer mobile cus

随机推荐

  • 从 shell 脚本编辑属性文件中的属性值

    标题说明了一切 我需要将我不知道的属性值替换为不同的值 我正在尝试这个 bin bash sed i s myprop myprop newvalue g file properties i get sed e expression 1 c
  • C# 中的 ref 和 out 与 C++ 中的指针相同吗?

    我刚刚用 C 创建了一个交换例程 如下所示 static void Swap ref int x ref int y int temp x x y y temp 它与此 C 代码执行相同的操作 void swap int d1 int d2
  • Windows 如何创建目录符号链接

    我正在尝试创建指向 Windows 8 1 目录的符号链接 使用 git bash 命令窗口以管理员身份运行 具有如下文件夹结构 magento plugin magento 我的插件是一个 git 存储库 我想将其符号链接到 magent
  • 列出Oracle中给定用户的所有表

    我是 Oracle 新手 想要查找用户 john 创建的所有表 我通过命令行连接到 Oracle 数据库 命令如下 sqlplus john passwd 如何列出给定用户创建的所有表 例如约翰 这将获取 JOHN 用户是所有者的所有表 S
  • Platform::String 真的那么没用吗?

    我正在尝试在 Windows Store 又名 Metro Style 应用程序中用 C CX 编写几行代码 我惊讶地发现平台 字符串缺少许多基本的字符串操作 例如 代替 or 指数 我想我可以使用内部数据 将其传递给 std string
  • 将 Access DB 表加载到数据表

    我有一个 ACCDB 格式的数据库 其中包含一些表 我使用以下代码成功将其加载到 OleDbDataReader 中 string connectionString Provider Microsoft ACE OLEDB 12 0 dat
  • Eclipse 插件的延迟激活

    我想知道 Eclipse 清单编辑器中的 加载其类之一时激活此插件 复选框有何用处 我认为 Eclipse 总是使用 延迟初始化 方法 这个选项与插件的 BundleActivator 类有关系吗 初始化与激活有什么不同吗 Here是一个类
  • 我可以在配备英特尔高清显卡的笔记本电脑上实现深度学习模型吗

    我目前正在为我的硕士学位做一个关于深度学习的项目 我想安装 keras 库 所以当我开始安装 Theano 和 tensorflow 时 我发现我必须安装 CUDA 但我的笔记本电脑配备了英特尔高清显卡 所以我的问题是 如果我安装它们 它会
  • Nuxt.js - 在所有网址末尾强制添加斜杠

    我正在寻找一种方法来确保我的所有网址都以尾随斜杠结尾 因此首先检查末尾是否已经有尾随斜杠 如果没有则添加一个 我尝试过nuxt 重定向模块 它可以添加斜杠 但随后会导致无限重定向 redirect from to from req gt l
  • Internet Explorer、Json.Net JavaScript 日期和毫秒问题

    我不确定是否是我遗漏了某些东西 或者 IE 或 Json Net 但基本上这是有效的 new Date 2012 08 03T12 36 54 743Z 此操作失败并出现 无效日期 错误 new Date 2012 08 03T12 36
  • Xcode - 警告:函数的隐式声明在 C99 中无效

    收到警告 函数 Fibonacci 的隐式声明在 C99 中无效 怎么了 include
  • 在 Windows Azure 上运行 Fleck(或任何)Websocket 服务器

    我想在 Azure 中以辅助角色运行 WebSocket 服务器 这在模拟器本地工作得很好 但是第一次运行套接字服务器时会出现 Windows 防火墙提示 我想知道是否有人知道如何克服 Azure 上套接字的连接问题 我的套接字服务器实现
  • 从嵌套文件夹导入模块[重复]

    这个问题在这里已经有答案了 我有这样的文件夹结构 main folder done test1 init py check py init py class Tries object def init self print Test 检查
  • 如何在 iframe 中查找 div

    我正在尝试使用 jquery 在 iframe 中查找 div 有没有比我下面使用的方法更好的方法 Iframe contents find MyDiv function atmslidein customer ready function
  • Flex 的 FXG 编辑器

    我见过的唯一适用于 Flex 的 FXG 编辑器是由 7jigen 制作 在线工作或 作为 Flex 应用程序 有人知道另一种吗 我认为它可以在 Illustrator 中完成 但这并没有真正提供简单的导出到 Flex 类型选项 只是给出坐
  • 使用方法引用进行混淆后,会出现 NoSuchMethodError 崩溃

    编译 proguard之前的源代码 public class IntentSession extends BaseIntentSession Override public void onResume super onResume mExe
  • 如何检索模块的路径?

    我想检测模块是否已更改 现在 使用 inotify 很简单 您只需要知道要从中获取通知的目录即可 如何在 python 中检索模块的路径 import a module print a module file 实际上会给你加载的 pyc 文
  • Delphi TPath.GetTempPath 结果被裁剪

    我正在使用 Delphi 2010 我的程序想要获取系统的临时路径 我正在使用 TPath GetTempPath 并且一切正常 至少对于我和我的同事来说 但在某些客户计算机上 此方法返回 当然 不存在的裁剪路径 我发现问题似乎是对 Get
  • 我可以在 Google App Engine(标准环境)中使用 Goroutines 吗?

    下面的例子似乎可行 但是使用安全吗 我的目标是进行一些非常轻的后台处理 而实际的任务队列作业感觉太繁重 func MyHandler w http ResponseWriter r http Request go func do somet
  • REST 复杂/复合/嵌套资源 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在尝试解决基于 REST 的 API 中的概念的最佳方法 不包含其他资源的扁平资源没有问题 我遇到麻烦的是复杂的资源 例如 我有一本漫画书的资源 ComicBook上面有各种