@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)带封面。