在我的REST API中创建新资源时,我想让用户可以请求一个已经包含一些默认值的空资源。由于它本身没有ID,我不完全确定我可以使用的RESTful URI。一些想法:可以使用什么URI来请求默认资源?
http://example.com/resource/_
http://example.com/resource/__new
有关该问题的任何建议或经验?
在我的REST API中创建新资源时,我想让用户可以请求一个已经包含一些默认值的空资源。由于它本身没有ID,我不完全确定我可以使用的RESTful URI。一些想法:可以使用什么URI来请求默认资源?
http://example.com/resource/_
http://example.com/resource/__new
有关该问题的任何建议或经验?
我认为这是一个比API更重要的UI事物 - 也就是说,UI应该预先将默认值填充到用户的各个表单域中,然后用户将填充空白并自定义默认值值如有必要。这并不适用于任何地方(例如,当您只有一个没有UI位的API时)。
您已经自己提出了一些选项 - 这些方法可行,但假设您可以访问现有资源/resource/123
,那么这两个选项至少会破坏您的URI设计。我可以考虑三种方法来解决这个问题,最后一个(第三个)可能是最好的选择。
方法#1
一个更好的办法是,以模仿的方式如何耗时的任务在REST通常完成。通常你有一个资源可以发送一个任务,然后该服务用一个任务URI回复,你可以稍后使用它来检查任务的进度。我们可以将它适应于我们的情况 - 使用默认值将空资源定义为新资源,我们可以使用该资源为其他资源获取“模板”。
例子:
假设你想获得一个名为“用户”资源的模板。你会首先做一个POST请求模板资源,并指示要创建一个“模板”资源的类型:
POST /template/
<?xml version="1.0" encoding="UTF-8" ?>
<template>
<type>user</type>
</template>
的API将创建指定类型的新的“默认”资源在成功的情况下,它会回应与:
HTTP/1.1 204 No Content
Location /user/123
在API的答复指定的位置,然后将包含该资源的模板:
GET /user/123
<?xml version="1.0" encoding="UTF-8" ?>
<user>
<id>123</id>
<name />
<email />
<preferred-language>en</preferred-language>
<timezone>UTC</timezone>
...
</user>
方法#2
方法#1已为您创建资源。另一种方法是允许用户访问特定URI上的模板。
例子:
GET /template/user
<?xml version="1.0" encoding="UTF-8" ?>
<user>
<name />
<email />
<preferred-language>en</preferred-language>
<timezone>UTC</timezone>
...
</user>
方法3
还有一个选择 - 我相信这是最简单,最合乎逻辑的做法,但它可能不适合所有案例。您可以通过直接向您想要使用的资源发送POST请求来创建具有默认值的空资源。一个缺点可能是这不会允许用户查看模板(他们可以在方法#1中),它总是会为它们创建一个资源(类似于方法#1)。
例子:
为了获取资源的默认版本,你会发送一个空的POST请求到资源:
POST /user/
的API将创建一个默认值的新资源和应对用:
HTTP/1.1 204 No Content
Location /user/123
相同方法#1中,URI将允许用户根据需要(通过PUT)获取创建的资源和然后改变它:
GET /user/123
<?xml version="1.0" encoding="UTF-8" ?>
<user>
<id>123</id>
<name />
<email />
<preferred-language>en</preferred-language>
<timezone>UTC</timezone>
...
</user>
感谢您的详细回复。与默认资源的想法是,我要求它 - 在我的情况下 - 能够预先填充UI形式。因此,如果用户决定永不提交该表单(这应该相当于根本不创建资源),那么创建新资源可能会很困难。 – Daff 2011-03-09 19:20:59
@Daff:我明白了,所以这就打破了方法#1和#3。我过去所做的解决方案提供了默认值作为UI逻辑的一部分,但这并不理想,特别是如果您想要将UI完全与API分离。 第二种方法适用于这种情况,我认为它比使用'/ resource/_new'更为RESTful,因为模板本身也是一种资源。然而,通过将其定义为一个新资源,可以将其与原来的资源(作为模板的资源)分开,这可能并不总是可取的(例如从URI结构的角度来看)。 – MicE 2011-03-10 09:18:47