我正在编写一个RESTful HATEOAS API。 我有复合实体,我必须GET,POST和PUT。 GET部分很简单,并且有很多例子。响应包含实体的原始属性以及指向嵌套实体的链接。 例如:
{
"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复合实体的最佳做法是什么?
答案 0 :(得分:3)
没有什么特别的有效载荷会对抗HATEOAS;唯一真正的问题是accountTypeId
不是很容易被发现。 (将魔术ID映射到简短的描述性字符串总是更好;将它们视为枚举。)在处理HATEOAS模型时要记住的一个关键事项是用户POST的实体不需要是正是创建资源的实体;你可以修改它,注释它,翻译它。它应该仍然在概念上相同,但这与相同完全不同。 (添加ID和创建时间戳将是扩展如何完全合理的极好例子。)
对我而言,您真正的问题是,您需要重新考虑客户在执行POST时应提交哪些信息,以及您打算如何告诉客户他们应该在执行时提交该信息POST。我自己,我非常喜欢在这里使用XML进行上传,因为我可以很容易地告诉客户端他们的POST有效负载应该符合特定的模式(并且XML Schema和RELAX NG都足以让我描述约束)。我确信这不是唯一的方法。