【问题标题】:REST API GET methodREST API GET 方法
【发布时间】:2015-02-23 12:33:25
【问题描述】:

根据 REST API 设计建议,通过 id 获取用户必须是

GET /users/{id}

如何通过唯一的电话号码获取用户?

GET /users/phone/{number}

GET /users/?phone=xxxxxxxxxxx

GET /phones/{number}/users

还是别的什么?

或者例如获取最后一个有限制的用户 cmets:

/users/{id}/comments/limit/{limit}

/users/{id}/comments/?limit='xx'

在这种情况下有限制或建议吗?

哪种 HTTP 方法更好地发送请求以进行某些操作(例如 SMS 发送)。

【问题讨论】:

  • 欢迎来到 StackOverflow!您的问题目前太模糊,无法提供有意义的答案。您是在询问特定的 REST API 还是 API 设计的一般方法?请澄清问题并酌情添加其他标签。
  • 这是一个品味问题。无论您选择哪种方法,都尝试通过所有资源 url 始终如一地坚持下去。
  • 我更新了答案以适应您的修改。

标签: api rest get


【解决方案1】:

你的问题有很多不同的方面,所以我选择了一些,希望答案对你有所帮助。

一般来说,URI 是某个资源的唯一标识符。此外,“良好的 REST-API URI”仅包含名词(用于“命名”资源),而不包含动词(应该对资源做什么)。 URI 参数可用于参数化资源表示,例如排序或过滤。

在你的例子中,

/users/{id}/?limit='xx'

将是获取某些子资源(可能是用户 cmets)列表的有效方法,但 URI 上没有引用特定属性或子资源(例如 cmets)的任何内容。

一个更有意义的资源 URI 应该是

/useres/{id}/cmets/?max=100&sort=asc

在这种情况下,第一部分 (users/{id}/cmets/) 标识资源,而参数用于参数化其表示。 正确的 URI 不依赖 URI 参数来唯一标识资源。

URI 中的过滤条件可以被类似处理。您可以将它们放入参数中,但这可能会导致多个和/或复杂过滤器出现问题,例如

获取 /useres/?phone=1234&phonemode=startswith&name=foo&namemode=contains

执行此操作的一种方法是创建一个过滤器(可能只是暂时的),然后使用以下 GET 请求检索过滤后的信息:

POST /users/filter
   name='mycomplexfilter'
   poperty='name'
   value='foo'
   mode='contains'        

GET /useres/filter/mycomplexfilter

希望这有助于阐明这个话题

[编辑] 有关常用 HTTP 方法(又名 verbs)的说明,请参阅此摘要:Which HTTP methods match up to which CRUD methods?

See this question 以获得类似的答案。

应使用 POST 请求发起服务器发送通知(可能通过 SMS)(例如发送到资源 URI /通知),并在负载中包含文本和收件人。 HTTP 标头可用于指示所需的通知类型,而 HTTP 状态代码指示发送尝试的成功。状态码 201 表示消息发送成功,同时返回新创建的资源的 URI。

客户请求:

POST /notifications

recipient="+0049123456789"
text="this is the SMS text"

服务器响应:

201 - Created
Location: /notifications/9876

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    相关资源
    最近更新 更多