我正在实现我的第一个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的请求相匹配。那么我应该如何语法化此端点?
答案 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。