@ray,精彩的讨论
@jgerman,不要忘了仅仅因为它是REST,并不意味着必须从POST中固定资源。
您选择包含在资源的任何给定表示形式中的内容取决于您。
您单独引用封面的情况仅仅是创建父资源(漫画书),而其子资源(封面)可能会被交叉引用。例如,您可能还希望单独提供对作者,发布者,字符或类别的引用。您可能希望单独创建这些资源,也可以在将它们作为子资源引用的漫画书之前创建。或者,您可能希望在创建父资源时创建新的子资源。
封面的具体情况稍微复杂一点,因为封面确实确实需要一本漫画书,反之亦然。
但是,如果您将电子邮件视为资源,而将发件人地址视为子资源,则显然仍可以单独引用发件人地址。例如,从地址获取全部。或者,使用先前的发件人地址创建一条新消息。如果电子邮件是REST,您可以轻松地看到许多交叉引用的资源可用:/ received-messages,/ draft-messages,/ from-addresses,/ to-addresss,/ addresses,/ subjects,/ attachments,/ folders ,/ tags,/ categories,/ labels等。
本教程提供了一个很好的交叉引用资源示例。
http://www.peej.co.uk/articles/restfully-delicious.html
这是自动生成数据的最常见模式。例如,您不会为新资源发布URI,ID或创建日期,因为它们是由服务器生成的。但是,当您取回新资源时,您可以检索URI,ID或创建日期。
关于二进制数据的示例。例如,您要发布二进制数据作为子资源。当您获得父资源时,您可以将那些子资源表示为相同的二进制数据,也可以表示为表示二进制数据的URI。
表单和参数已经不同于资源的HTML表示形式。张贴二进制/文件参数以生成URL并不是一个麻烦。
当您获取新资源的表单(/ comic-books / new)或获取表单以编辑资源(/ comic-books / 0 / edit)时,您正在要求该资源的表单特定表示。如果使用内容类型“应用程序/ x-www-form-urlencoded”或“ multipart / form-data”将其发布到资源集合,则要求服务器保存该类型表示形式。服务器可以响应已保存的HTML表示形式或其他形式。
您可能还希望出于API或类似目的,将HTML,XML或JSON表示形式发布到资源集合中。
考虑到漫画后张贴的封面,但也要求漫画具有封面,也可以按照您的描述来表示您的资源和工作流程。示例如下。
- 允许延迟创建封面
- 允许创建具有所需封面的漫画书
- 允许交叉引用封面
- 允许多个封面
- 创建漫画书草案
- 创建漫画封面
- 出版漫画书草案
GET / comic-books
=> 200 OK,获取所有漫画书。
GET / comic-books / 0
=> 200 OK,获取带有封面(/ covers / 1,/ covers / 2)的漫画书(id:0)。
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 -book / 3 / covers / 1)。
GET / draft-comic-books / 3 / publish
=> 200 OK,获取表格以发布漫画草案(id:3)(表格:POST / published-comic-books)。
POST / published-comic-books
标题= foo
作者= boo
出版商= goo
发布= 2011-01-01
cover_type = front
cover_data =(binary)
=> 302找到,位置:/ comic-books / 3,重定向到已出版的漫画书(编号:3)带盖。