我有一个关于设计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
什么被认为是最合适的方法?
谢谢,
杰伊答案 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"}
通常客户端会发送整个对象,而不仅仅是要更新的字段。