2013-03-11 75 views
4

假设我们有集合/items/,我们要允许客户端增加新项目到这个集合。通过Rails的启发,我得出如下:我们只需添加资源/items/new,谁想要添加项目首先发出GET /items/new,接收空实体(可能与一些默认值设定)之一,然后充满希望的领域和问题POST /items/创建新的文档(实体),将其添加到收藏

  • 此方法适用于真正的REST API吗?什么可以改进/重做?
  • 如果突然这种做法是很好的(如果不是,反正):

    假设每个项目都有必填字段标题。回复GET /items/new回复默认值可能不太好。 在这种情况下有什么更好?要返回null标题并且在POST空白时返回错误?要为new资源实现类似构造器的逻辑,请求查询字符串中的必填字段?还有别的吗?

谢谢。

UPD。只是为了澄清,使用new不是关于将“添加”分割为“分配”和“写入内容”,因为没有对数据存储的操作在GET /items/new上完成。它意味着实现实体设计的灵活性:富客户端可根据响应新事件而动态呈现输入字段。那有意义吗?或者合同是固定的,我们需要为这样的改变版本API?

回答

3

为什么首先返回一个空项目?我只是让客户端将新项目(包括其所有属性)发布到/ items/new。至少这是我记得在Rails中完成的方式;)

在任何情况下,额外返回一个空物品都没有用处,增加了一个额外的网络往返行程,并有可能通过拆分“添加”操作分为“分配”和“写入内容”。

如果你想做任何唯一性检查,UID生成等,可以完成(或更好)一个“添加完整的项目”操作。

更新:混淆可能来自这样一个事实,即rails控制器既充当REST API,又充当Web UI的控制器。这意味着某些操作在API(某些应用程序/代码使用)中非常有用,有些操作因为表示层(由人使用)需要它可以调用的某些内容而需要。 我不会真的认为“新”动作在API中很有用,但用户确实需要他可以调用的东西来获取空表单。

+0

我同意。为什么要为数据访问服务提供类似于构造函数的功能。你可以把这些东西放在客户端。 – lavrik 2013-03-11 16:52:32

+1

@creinig:在[Rails]中查看[this](http://guides.rubyonrails.org/getting_started.html#creating-new-posts)。它不会将“添加”到“分配”和“写入内容”中,因为没有对数据存储的操作在GET/items/new上完成。它意味着实现实体设计灵活性的一种方式:富客户端可以根据响应“新”的动态呈现输入字段。那有意义吗? – starteleport 2013-03-11 17:07:51

+0

@starteleport:好的,有效的点。但是,如果这是需要的,它应该被明确地建模为两个单独的动作。你链接的rails教程也是这样(动作'新'和'创建')。它也允许在没有前面的“新”的情况下调用“创建”。 – creinig 2013-03-11 17:43:37

2

通常当我创建一个REST API,我用的是实体名称的单数形式,所以它的

api.company.com/item 

从那里,如果客户想是一个特定的项目,他们会做一个HTTP GET

api.company.com/item/{id} 

而且通常你不希望动词在URL中。所以“item/new”是糟糕的设计。标准的HTTP方法应该是足够的(GET,POST,PUT,DELETE)

所以对于你的情况,我建议不要做“项目/新”,只是让客户做一个HTTP POST到

api.company.com/item 

如果你在做XML,你可以给客户一个XSD,以便他们知道需要或不需要。如果您使用的是JSON,它可能会在某个地方记录下来。

至于执行所需的“标题”字段,我会验证所有发布到您的资源的新实体。我假设你有一个发布数据映射到的域模型。你可以做你的验证并返回一个状态为400的HTTP响应,或者你的API有自定义错误响应。

这里有一个resource我看看漂亮往往记住HTTP状态代码及其含义

+0

请参阅主文章中的更新。它更好吗?或者仍然是否定的? – starteleport 2013-03-11 17:41:56

+0

通常作为API提供者,您不应该关注客户端[(SoC)](http://en.wikipedia.org/wiki/Separation_of_concerns)显示的默认值,这是客户端的域。如果有默认值在某种程度上至关重要,那么您可能会将您的文档放在您的文档中,以便客户可以为模板调用api.company.com/item/{someid}。但如果它不重要,你应该把它留给客户。 – Khon 2013-03-11 19:13:06

相关问题