2013-02-14 100 views
9

我在写一个RESTful HATEOAS API。 我有复合实体,我必须GET,POST和PUT。 GET部分很简单,并且有很多例子。响应包含实体的原始属性和链接到嵌套实体。 例如:RESTful HATEOAS API中的HTTP POST请求

{ 
"id":"2", 
"firstName":"Brad", 
"lastName":"Pitt", 
"balance":1234.5, 
"transactions":"http://localhost:8080/jersey-poc/api/v1.1/account/1/transactions", 
"self":"http://localhost:8080/api/v1.1/account/1", 
"accountType":"http://localhost:8080/api/v1.1/account/1/accountType" 
} 

,当我要创建或修改的帐户,就会出现问题。我需要将帐户与accountType相关联。我可以发送POST请求,如下所示:{"firstName":"Michael","lastName":"Jackson","balance":300.0,"accountTypeId":5}
但这会打破HATEOAS范例。 POST/PUT复合实体的最佳实践是什么?

回答

4

没有什么特别的有关负载会违背HATEOAS;唯一真正的问题是accountTypeId不是很好发现。 (Magic ID总是会被映射成简短的描述性字符串;认为它们像枚举一样)。在使用HATEOAS模型时要记住的关键事项之一是用户POST不需要的实体恰恰是创建资源的实体;你可以修改它,注释它,翻译它。它应该仍然是在概念上相同,但这是完全不同的相同。 (添加ID和创建时间戳将是扩展如何完全合理的极好例子。)

对我来说,听起来像你真正的问题是,你需要重新考虑客户在POST时应该提交什么信息,以及您打算告诉客户,他们应该在进行POST时提交该信息。我自己,我很喜欢在这里使用XML来上传,因为我可以很容易地告诉客户端他们的POST有效载荷应该符合特定的模式(并且XML模式和RELAX NG都足以描述约束)。我相信这不是唯一的方法。

+0

谢谢。这解释了它。我确信请求和回应必须一致。 – 2013-02-14 13:06:16