在我的REST API中创建新资源时,我想让用户可以请求已包含一些默认值的空资源。由于它本身没有ID,我不完全确定我可以使用的RESTful URI。一些想法:
http://example.com/resource/_
http://example.com/resource/__new
有关该问题的任何建议或经验吗?
答案 0 :(得分:1)
我认为这更像是UI事物而不是API事物 - 即UI应该将默认值预填充到用户的相应表单字段中,然后用户只需填写空白并自定义默认值如有必要。但这并不适用于所有地方(例如,当您只有没有UI位的API时)。
您已经自己提出了一些选项 - 这些选项可行,但假设您可以像/resource/123
那样访问现有资源,这两个选项都会破坏您的URI设计至少一点。我可以想到如何处理这个问题的三个选择,最后一个(第三个)可能是最好的选择。
方法#1
更好的方法可能是模仿在REST中通常完成时间密集型任务的方式。您通常拥有一个POST任务的资源,然后该服务使用任务URI进行回复,您可以稍后使用该URI来检查任务的进度。我们可以根据我们的情况调整它 - 使用默认值定义空资源作为新资源,我们可以使用它来获取不同资源的“模板”。
实施例
假设您要获取名为“user”的资源的模板。您首先要对模板资源发出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>