RESTFul HATEOAS API中的HTTP POST请求

Ami*_*ost 11 rest hateoas

我正在编写一个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"
}
Run Code Online (Sandbox Code Playgroud)

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

Don*_*ows 4

该有效负载没有任何与 HATEOAS 相悖的特殊之处;唯一真正的问题是它accountTypeId不太容易被发现。(将 Magic ID 映射为简短的描述性字符串总是更好;将它们视为枚举。)使用 HATEOAS 模型时要记住的关键事项之一是,用户 POST 的实体不需要是正是创建资源的实体;你可以修改它、注释它、翻译它。它在概念上仍然应该是相同的,但这与完全相同完全不同。(添加 ID 和创建时间戳将是扩展如何完全合理的绝佳示例。)

对我来说,听起来您真正的问题是您需要重新考虑客户在执行 POST 时应提交哪些信息,以及您打算如何告诉客户他们在执行 POST 时应提交该信息。就我个人而言,我非常喜欢在这里使用 XML 进行上传,因为我可以轻松地告诉客户他们的 POST 有效负载应该符合特定的架构(XML Schema 和 RELAX NG 都足够丰富,足以让我描述约束)。我确信这不是唯一的方法。