@ray,精彩的讨论
@jgerman,不要忘记仅仅因为它是REST,并不意味着必须从POST设置资源 .
您选择在任何给定的资源表示中包含的内容取决于您 .
您单独引用的封面的情况仅仅是创建父资源(漫画书),其子资源(封面)可以交叉引用 . 例如,您可能还希望单独提供对作者,发布者,字符或类别的引用 . 您可能希望单独创建这些资源,也可以在漫画书之前创建这些资源,将其作为子资源引用 . 或者,您可能希望在创建父资源时创建新的子资源 .
您的封面的具体情况稍微复杂一点,封面确实需要漫画书,反之亦然 .
但是,如果您将电子邮件视为资源,并将发件人地址视为子资源,您显然仍可以单独引用该地址 . 例如,从地址获取所有内容 . 或者,使用前一个地址创建一条新消息 . 如果电子邮件是REST,您可以很容易地看到许多交叉引用的资源可用:/ received-messages,/ draft-messages,/ from-addresses,/ to-addresses,/ addresses,/ subject,/ attachments,/ folders ,/ tags,/ categories,/ labels,et al .
这是自动生成数据的最常见模式 . 例如,您不会为新资源发布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或类似目的 .
它也有可能代表您描述的资源和工作流程,考虑到漫画书后发布的封面,但要求漫画书有封面 . 示例如下 .
允许延迟创建封面
允许创建漫画创作所需的封面
允许交叉引用封面
允许多个封面
创建漫画书草稿
创建漫画书封面草稿
发布漫画书草稿
GET /漫画书
=> 200好,获取所有漫画书 .
GET /漫画书/ 0
=> 200 OK,获取带封面的漫画书(id:0)(/ cover / 1,/ covers / 2) .
GET /漫画书/ 0 /封面
=> 200 OK,获取漫画书的封面(id:0) .
GET /封面
=> 200 OK,获取所有封面 .
GET / cover / 1
=> 200 OK,用漫画书(/漫画书/ 0)获取封面(id:1) .
GET /漫画书/新
=> 200好,获取表格创建漫画书(表格:POST / draft-comic-books) .
POST / draft-comic-books
名称= foo
笔者=嘘声
出版商=咕
出版= 2011-01-01
=> 302找到,位置:/ draft-comic-books / 3,重定向到草稿漫画书(id:3),封面(二进制) .
GET / draft-comic-books / 3
=> 200好,获得有封面的漫画书(id:3) .
GET / draft-comic-books / 3 / cover
=> 200 OK,获取漫画书草稿(/ draft-comic-book / 3) .
GET / draft-comic-books / 3 / cover / new
=> 200好,获取表格为草稿漫画书(/ draft-comic-book / 3)创建封面(表格:POST / draft-comic-books / 3 / cover) .
POST / draft-comic-books / 3 / cover
cover_type =前
cover_data =(二进制)
=> 302找到,位置:/ draft-comic-books / 3 / cover,重定向到漫画书草稿的新封面(/ draft-comic-book / 3 / covers / 1) .
GET / draft-comic-books / 3 /发布
=> 200好,获取表格发布漫画书(id:3)(表格:POST /已发布 - 漫画书) .
发布/出版漫画书
名称= foo
笔者=嘘声
出版商=咕
出版= 2011-01-01
cover_type =前
cover_data =(二进制)
=> 302找到,位置:/ comic-books / 3,重定向到已出版的漫画书(id:3),带封面 .