REST API-端点语法-按属性获取项目-不按ID获取

时间:2019-08-03 14:59:56

标签: rest api

我正在实现我的第一个REST API,并且对URL端点的语法有疑问。

我知道我应该使用这些端点进行获取,创建,更新和删除:

  • 获取商品列表
    方法:GET,网址:/api/items

  • 通过ID获取商品
    方法:GET,网址:/api/items/:id

  • 添加项目(请求正文中的新项目数据)
    方法:POST,网址:/api/items

  • 修改项目(请求正文中的已修改项目数据)
    方法:PUT,网址:/api/items/:id

  • 删除项目
    方法:DELETE,网址:/api/items/:id

但是可以说项目的界面是

interface item
{
  id: string;
  name: string;
}

通过名称获取商品的请求网址应该是什么?
我无法使用方法:GET,网址:/api/items/:name,因为这将与获取ID的请求相匹配。那么我应该如何语法化此端点?

2 个答案:

答案 0 :(得分:1)

您应该在集合端点上使用过滤器,例如:

方法:GET,网址:/api/items?name=foo

此过滤器可以返回其中包含foo字符串的所有项目(具体取决于您要如何在搜索/过滤条件中处理通配符),例如响应可能是项目的集合

{
    "data": [
        {
            "id": "d079d8e9-4d24-4514-b356-78587f6c2ba9",
            "name": "foo"
        },
        {
            "id": "7f5e558c-6a7f-4ebe-8f4f-a2d029a803ed",
            "name": "foo bar" 
        }  
    ]
}

如果您希望响应返回单个资源,则还可以使用该名称作为标识符,并使用该名称从上方应用方案,例如

方法:GET,网址:/api/items/:name

答案 1 :(得分:1)

除非您正在执行OData,否则没有标准的REST URI语法。您可以自由地设计自己的URI,即使/resource/{id}也是完全有效的。

我想做的是用/结束集合的URI,并使用查询来过滤集合。因此,如果它们具有唯一的名称,并且您希望一个项目而不是一个集合,那么我会这样做:/api/{version}/items/?name={name}。但这是我的风格。

从客户端角度看,URI语法完全无关紧要,因为服务器根据HATEOES约束将有效的URI模板提供给客户端。如果您不这么认为,则可能是在构建CRUD API而不是REST API。