@ray,精彩的讨论
@jgerman,不要忘记仅仅因为它是 REST,并不意味着资源必须从 POST 中固定下来。
您选择在任何给定的资源表示中包含什么取决于您。
您单独引用的封面的情况仅仅是创建一个父资源(漫画书),其子资源(封面)可以被交叉引用。例如,您可能还希望单独提供对作者、出版商、人物或类别的引用。您可能希望单独或在将它们作为子资源引用的漫画书之前创建这些资源。或者,您可能希望在创建父资源时创建新的子资源。
您的封面的具体情况稍微复杂一些,因为封面确实需要一本漫画书,反之亦然。
但是,如果您将电子邮件消息视为资源,而将发件人地址视为子资源,您显然仍然可以单独引用发件人地址。例如,从地址中获取所有信息。或者,使用以前的发件人地址创建一条新消息。如果电子邮件是 REST,您可以很容易地看到可以使用许多交叉引用的资源:/received-messages、/draft-messages、/from-addresses、/to-addresses、/addresses、/subjects、/attachments、/folders 、/标签、/类别、/标签等。
本教程提供了一个很好的交叉引用资源示例。
http://www.peej.co.uk/articles/restfully-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 表示或其他内容进行响应。
出于 API 或类似目的,您可能还希望允许将 HTML、XML 或 JSON 表示发布到资源集合中。
也可以按照您的描述来表示您的资源和工作流程,考虑到在漫画书之后发布的封面,但要求漫画书有封面。示例如下。
- 允许延迟封面创建
- 允许创建具有所需封面的漫画书
- 允许交叉引用封面
- 允许多个封面
- 创建草稿漫画书
- 创建漫画书封面草稿
- 发布草稿漫画书
GET /comic-books
=> 200 OK,获取所有漫画书。
GET /comic-books/0
=> 200 OK,获取带有封面的漫画书 (id: 0) (/covers/1, /covers/2)。
GET /comic-books/0/covers
=> 200 OK,获取漫画书的封面(id:0)。
GET /covers
=> 200 OK,获取所有封面。
GET /covers/1
=> 200 OK,用漫画书 (/comic-books/0) 获取封面 (id: 1)。
GET /comic-books/new
=> 200 OK,获取创建漫画书的表单(表单:POST /draft-comic-books)。
POST /draft-comic-books
title=foo
author=boo
publisher=goo
published=2011-01-01
=> 302 找到,位置:/draft-comic-books/3,重定向到草稿漫画书(id:3)覆盖(二进制)。
GET /draft-comic-books/3
=> 200 OK,获取带有封面的草稿漫画书(id:3)。
GET /draft-comic-books/3/covers
=> 200 OK,获取草稿漫画书 (/draft-comic-book/3) 的封面。
GET /draft-comic-books/3/covers/new
=> 200 OK, 获取表格为草稿漫画书创建封面 (/draft-comic-book/3) (表格: POST /draft-comic-books/3/盖子)。
POST /draft-comic-books/3/covers
cover_type=front
cover_data=(binary)
=> 302 找到,位置:/draft-comic-books/3/covers,重定向到漫画草稿的新封面 (/draft-comic -书/3/封面/1)。
GET /draft-comic-books/3/publish
=> 200 OK,获取表单以发布漫画书草稿(id:3)(表单:POST /published-comic-books)。
POST /published-comic-books
title=foo
author=boo
publisher=goo
published=2011-01-01
cover_type=front
cover_data=(binary)
=> 302 Found,位置:/comic-books/3,重定向到已出版的漫画书(id: 3) 带盖。