我正在设计一个API。
有用户个人资料,可在
访问http://example.org/api/v1/users(分别为http://example.org/api/v1/users/:id)
现在,用户的个人资料将是动态的。 因此,我们将允许API函数添加新的配置文件属性。
以下是否为此有效的REST API URL?
POST http://example.org/api/v1/users/attributes
实际上,要检索特定用户,用户的ID将附加到.../users/
URL。
现在,如果我使用" attributes
"在/users/
之后的元素,会以某种方式破坏URL的用户ID模式吗?
我希望将基本网址保持为api/v1/users
,因为从逻辑上讲,我正在修改用户个人资料...
编辑:属性将添加到所有配置文件有效,它独立于用户。假设该个人资料有"姓名","姓氏","电子邮件",我想添加"地址"到所有个人资料(当然我知道缺少"地址"字段的用户将无法获得新属性)
解决此类问题的良好做法是什么?
答案 0 :(得分:1)
我认为ID应该保存在URL中,因为您要将属性添加到特定用户,对吧?
答案 1 :(得分:1)
只要/api/v1/users/attributes
不能是文字:"属性",使用:id
是一种可接受的解决方案。但是我建议为属性创建自己的媒体类型,微格式或微数据,因为它是一种类型而不是资源。
我认为你应该检查这些链接:
如果用户可以设置她可以拥有的属性,那么您是否应该使用属性资源。但是每个用户应该有一个。但我不认为使用资源是必要的,微观数据和微格式都包含足够的人物描述属性......
5个月后有些更新:
现在,如果我使用"属性" / users /之后的元素 以某种方式打破了URL的用户ID模式?
从客户的角度来看," id pattern"不存在。客户端通过检查注释给它们的语义来跟踪链接。因此,REST客户端与实际REST API(又名。uniform interface constraint)的URI结构完全分离。如果您的模式中断,那么它完全是服务器端,链接生成和路由问题,这不是客户端关注的问题。
说个人资料有"姓名","姓氏","电子邮件",我要添加 "地址"所有个人资料。解决这种问题的好方法是什么? 问题
在这种情况下,地址是一个可选字段,可能是一个子资源,因为它可以包含其他字段,如城市,邮政编码,街道等...您可以单独添加地址,例如{{1}或者您可以将这些字段添加到您的用户表单,并向用户添加部分更新,如果只有地址更改,则为PUT /users/123/address {city: "", street: "", ...}
。
答案 2 :(得分:0)
如果您想要更新整个集合中的每个资源,我会向PATCH
发送/users
请求。
答案 3 :(得分:0)
虽然它是有效的URI,但我建议避免使用POST http://example.org/api/v1/users/attributes
。在我看来,当集合端点具有不是集合成员的子节点时,它违反了最小惊喜的原则。如果您想跟踪所有用户共享的用户属性,那么这是一个单独的集合,可能是/user-attributes
。
POST /user-attributes
{
"name": "Email Address",
"type": "String",
...
}
GET /user-attributes
将返回所有可能的属性,GET /user-attributes/{id}
将返回属性周围的所有元数据。
如果没有元数据,那么@ inf3rno的建议只是将属性提升并让服务器处理它绝对值得考虑。
这一切都预示着您需要通过API管理属性。如果没有,我同意@ inf3rno,媒体类型是要走的路。当然,在这种情况下,您可能需要用户属性资源的媒体类型..