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 复杂/复合/嵌套资源 [关闭] 的相关文章

  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • 如何给所有HttpClient请求方法添加参数?

    我正在编写一些使用 Apache 的 Java 代码HttpClient版本4 2 2使用 RESTful 第三方 API 该 API 具有利用 HTTP 的方法GET POST PUT and DELETE 需要注意的是 我使用的是 4
  • Spring Boot 自定义 ErrorAttributes http 状态未设置为响应

    继Spring Boot之后文档 http docs spring io spring boot docs current reference htmlsingle boot features error handling我定义了自己的 E
  • .Net Web API 抛出异常/返回响应/返回 404/400 响应的错误响应?

    我正在使用 net web api 开发一些宁静的 Web 服务 对于某些情况 我需要向客户端返回 404 NotFoundStatus 或 400 BadRequest 看起来框架中有很多方法可以做到这一点 下面列出一些我所知道的方法 是
  • 我在 Scala 中将资源放在哪里?

    在学习使用 Scala 和 JavaFX 时 我在 a 中遇到了以下代码ProScalaFX 示例 https github com jpsacha ProScalaFX val resource getClass getResource
  • 从 Silverlight 中的文件夹加载资源“.resx”

    我有一个多语言应用程序 客户想要按照他的意愿编辑 Resources resx 文件 我创建了 silverlight 项目并添加了一些文件 资源 resx 资源 en US resx1 资源 uk UA resx2 他们都有构建操作 嵌入
  • Eclipse:在类路径上查找资源

    eclipse 有没有办法在类路径中搜索任意资源文件名 或模式 我知道我可以使用 Navigate gt Open Type 这将扫描类路径中的类 或 Navigate gt Open Resource 它将搜索任何资源类型 但仅在我的项目
  • 对多个路径使用 Single Jersey REST 类

    我已经开始使用 JAX RS 开发 REST 服务 使用 Jersey 非常简单 但是我在使用 Spring MVC 和 Jersey REST 类时遇到的一个区别是 Spring 支持忽略根路径元素并在方法级别具有单独的路径映射 因此 如
  • Laravel 中的 PATCH Ajax 请求

    是否可以向 Laravel 发出 Ajax PATCH 请求 或者我是否仅限于 POST Laravel 在输入隐藏字段中使用 PATCH 但是 我没有使用表单元素 只是在单击时 通过 Ajax 请求 应该部分更新记录的按钮 这条路线会是什
  • iPhone RESTful Web 服务

    然而 甚至不确定标题是否正确 我想做的是使用标准 NSURLConnection 类来处理调用我的 web 服务的响应 我使用 POST 方法更新数据库 使用 GET 方法从数据库检索行 我遇到的问题是这两个操作可能同时发生 因此处理请求的
  • 使用 Spring RestTemplate 时忽略 SSL 证书验证

    我正在使用 Spring RestTemplate 发出 HTTPS 请求 并且我想忽略 SSL 证书 这是我创建restTemplate请求的代码 TrustStrategy acceptingTrustStrategy X509Cert
  • 有没有一种简单的方法可以在 Eclipse 的 java 项目中使用 XML 资源?

    我想用 java 解析 XML 文件 好吧 很简单 如果我可以使用在同一个 Eclipse 项目的文件夹 我们称之为 资源 文件夹 中创建的 XML 文件 那就太好了 由于版本控制 多个开发平台和总体简单性等问题 拥有此功能而不是访问文件系
  • 是否应该在 REST API PUT 请求中传递资源及其相关资源的所有字段?

    假设我有一个票证和评论资源 门票可以有很多评论 在您的更新端点中HTTP PUT api tickets
  • 如何下载到 Excel?

    我想为我的 Coldfusion 网站不同部分上的几组不同数据提供 下载到 Excel 功能 我正在使用 Coldfusion 并且希望使用免费的自定义标签 库来帮助我完成此任务 而不是自己从头开始编码 我被指出cflib org http
  • 如何使用 JAXRS 和 JAXB 设置 Restlet 服务器?

    我一直在互联网上查找 试图找到如何执行此操作的示例 我只是想设置一个 REST 服务器 它自动将对象序列化到 XML 或从 XML 序列化对象 我只是想提供一个服务器 以便于用户登录 注销以及仅在用户登录后访问 XML 对象列表 启动并运行
  • 使用 Post 以 REST 方式更新值

    我对 REST 很陌生 所以如果这是一个愚蠢的问题 请原谅我 这样 我就有了客户资源 一个客户有很多信用 所以 我想获取客户积分的 URL 是 客户 21 积分 其中 21 是客户 ID 现在 如果我没有全额积分 如何添加积分 例如 客户有
  • Django REST Framework:无法使用视图名称解析超链接关系的 URL

    我已经广泛研究了这个相当常见的问题 但没有一个修复对我有用 我正在 REST 框架中构建 Django 项目 并希望使用超链接关系 用户可以拥有许多独立的汽车和路线 路线是位置的集合 这些是我的序列化器 class CarSerialize
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • REST 将多个输入传递给 GET 方法

    我在 RAD 中部署了一个简单的基于 REST 的应用程序 使用以下方式访问简单的 URLhttp localhost
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja

随机推荐

  • 从 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上面有各种