2011-03-09 53 views
2

在我的REST API中创建新资源时,我想让用户可以请求一个已经包含一些默认值的空资源。由于它本身没有ID,我不完全确定我可以使用的RESTful URI。一些想法:可以使用什么URI来请求默认资源?

http://example.com/resource/_ 
http://example.com/resource/__new 

有关该问题的任何建议或经验?

回答

1

我认为这是一个比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> 
+0

感谢您的详细回复。与默认资源的想法是,我要求它 - 在我的情况下 - 能够预先填充UI形式。因此,如果用户决定永不提交该表单(这应该相当于根本不创建资源),那么创建新资源可能会很困难。 – Daff 2011-03-09 19:20:59

+0

@Daff:我明白了,所以这就打破了方法#1和#3。我过去所做的解决方案提供了默认值作为UI逻辑的一部分,但这并不理想,特别是如果您想要将UI完全与API分离。 第二种方法适用于这种情况,我认为它比使用'/ resource/_new'更为RESTful,因为模板本身也是一种资源。然而,通过将其定义为一个新资源,可以将其与原来的资源(作为模板的资源)分开,这可能并不总是可取的(例如从URI结构的角度来看)。 – MicE 2011-03-10 09:18:47