【问题标题】:RESTful service and naming conventionsRESTful 服务和命名约定
【发布时间】:2016-05-31 12:28:52
【问题描述】:

我的实体名为Item

POST     /api/items          create a new Item
PUT      /api/items/{id}     update an existing Item
GET      /api/items/{id}     get Item by id

但是,我需要以三种不同的模式检索项目:最近的(按纬度经度距离)、Favorite(由 isFavorite 标志标记)和 个人(由用户插入)。

虽然我可以命名这三个 URL:

GET      /api/items/nearest?latitude=xxx&longitude=xxx&distance=xxx
GET      /api/items/favorite
GET      /api/items/personal

但是当我读到这可能违反 REST 命名约定时。我应该使用类型参数(某种枚举)吗?但是这样用户就可以调用GET /api/items?type=favorite&latitude=xxx&longitude=xxx&distance=xxx,这是没有意义的。

最后一个问题:Twitter API 似乎不遵守 REST 命名约定,端点像 POST statuses/updateGET direct_messages/sent。你怎么看?

【问题讨论】:

    标签: web-services api rest asp.net-web-api2 restful-url


    【解决方案1】:

    REST 不是一个标准——它是一个概念,所以实际上你不能粗暴地违反它。

    但在您的情况下,我建议再添加一条 GET 路线

    GET /api/items?type=favorite|personal|nearest&...

    并将您的“模式”作为获取查询传递,而不是将其与 id 混合使用

    【讨论】:

    • 这就是我的建议,但我不喜欢调用/api/items?type=favorite&latitude=xxx&longitude=xxx&distance=xxx,因为纬度、经度和距离对于收藏模式没有用处。 ..
    • 因此您的查询参数不能是强制性的。您只能检查“最近”请求的纬度、语言和距离。
    • 是的,我知道,虽然这会让最终用户感到困惑,但也许这是正确的方法 :)
    • 即使在这里您也可以将此参数设为可选。例如,如果您可以从数据库记录中获取用户位置 - 有时它非常有用 - 例如,如果您的用户使用手机应用程序和浏览器登录,他可以阻止网站的地理位置,但您可以在没有地理数据的情况下正确回答请求,因为您已经通过手机获得了它的位置。
    【解决方案2】:

    REST 没有 URI 命名约定。

    我看到的支持问题

    GET /api/items/{id} 
    GET /api/items/favorite
    

    这会让客户感到困惑吗,因为有时/items 之后的路径段是表示单个资源的 id,有时是表示组资源的名称。

    我看到的支持问题

    GET /api/items?type=favorite&latitude=xxx&longitude=xxx&distance=xxx
    

    正如您所认识到的,在某些查询参数可能会或可能不会应用于结果的情况下,让客户端进行令人困惑的调用是有问题的。

    在我看来,问题实际上是最近的项目,因为这需要一组在其他上下文中没有意义的查询参数。另一种选择是使用单独的顶级端点。

    GET /api/items/{id}?favorite=true&personal=false
    GET /api/nearest-items/latitude=xxx&longitude=xxx&distance=xxx
        [optional ?favorite and ?personal query params] 
    

    请注意,如果您添加其他一些也需要多个查询参数的选择条件,这将非常糟糕。

    编辑-----

    嗯。另一种选择是将三个可选的最近参数混合为一个。

    GET /api/items?nearestTo=12.34,54.40,5&favorite=true
    

    这不太适合人类阅读,但人类真的会阅读您的 URI 吗?

    【讨论】:

    • 对不起,但我不明白为什么它会严重崩溃......难道不能有另一个具有多个参数的顶级端点吗?
    • @Alessandro 是的。问题是您是否想为该其他端点找到/nearest-items。如果新端点是GET /api/funky-items?requiredParam=xxxx&otherRequiredParam=yyyy,那么客户永远找不到最近的时髦物品——他们必须选择。您可以添加查询参数以指定最近的,但随后您又回到了开始的位置,并且应该只保留带有可选查询参数的单个端点。
    • 好的,现在我明白了。我不认为我会有这个问题,所以也许这可能是正确的方法...... :)
    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2014-07-25
    • 2014-12-26
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    相关资源
    最近更新 更多