这是一个有效的REST API吗?

时间:2014-04-24 21:28:29

标签: api rest url

我正在设计一个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,因为从逻辑上讲,我正在修改用户个人资料...

编辑:属性将添加到所有配置文件有效,它独立于用户。假设该个人资料有"姓名","姓氏","电子邮件",我想添加"地址"到所有个人资料(当然我知道缺少"地址"字段的用户将无法获得新属性)

解决此类问题的良好做法是什么?

4 个答案:

答案 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,媒体类型是要走的路。当然,在这种情况下,您可能需要用户属性资源的媒体类型..

相关问题