11

我正在编写一个 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 复合实体的最佳实践是什么?

4

1 回答 1

3

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

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

于 2013-02-14T09:40:39.107 回答