针对“最深”资源项的正确RESTful响应格式所需的建议

时间:2012-09-18 18:18:22

标签: json rest

我有一个关于设计RESTful API的“概念”问题,该API返回并接受JSON格式的数据。

考虑以下请求和回复:

GET http://host/records/12345

{ "id":"12345", "address":{"street":"main street","number":5,"city":"springfield"}}

GET http://host/records/12345/address

{"street":"main street","number":5,"city":"springfield"}

GET http://host/records/12345/address/city

{"city":"springfield"}

OR

springfield (=not valid json)

我意识到第二个答案不是有效的JSON响应,所以我认为后者是我问题的正确答案。但是,由于请求者在请求期间已经知道“密钥”,因此以密钥/值的形式进行响应对我来说似乎是多余的。

更新次数相同:

当我想用另一个值更新我的12345记录的城市时,提交更正确的内容:

PUT http://host/records/12345/address/city

{"city":"paris"}  <- content of body when submitting

OR

paris <- content of body when submitting (=not valid json)

我问的原因是因为人们已经有了足够的

PUT http://host/records/12345/address

{"city":"paris"}   <- content of body when submitting

什么被认为是最合适的方法?

谢谢,

杰伊

1 个答案:

答案 0 :(得分:2)

REST API通常用于资源,这些资源可以松散地转换为数据库中的对象或表。您的第一个GET示例并不表示您正在尝试获取“地址”类型的资源。如果您想为API添加额外资源(例如“公司”),那么这一点就不清楚了。应该有一种方法来获取所有地址的列表。因此,获取API调用的所有地址将是

GET http://host/records/address

[{"id":"12345", "street":"main street","number":5,"city":"springfield"},
{"id":"12346", "street":"foo street","number":1,"city":"alexandria"}]

要获得特定地址,它看起来像

GET http://host/records/address/12345

{"id":"12345", "street":"main street","number":5,"city":"springfield"}

该id是地址对象的一部分,我认为没有必要像在您的示例中那样将其分解为父对象。然后,您可以使用该ID让您的Web服务知道需要更新的内容。所以你的更新看起来像这样。

PUT http://host/records/address

{"id":"12345", "street":"main street","number":5,"city":"paris"}

通常客户端会发送整个对象,而不仅仅是要更新的字段。