首页 > 解决方案 > 用于搜索和过滤的 REST API 独立端点

问题描述

我为一个简单的市场制作了一个 webapp。我有三个不同的功能:搜索、过滤、按键过滤。这些函数中的每一个都包含不同的查询参数。我的问题是我应该如何以休息的方式分离这些端点?

例如,这是我的搜索端点:

API.get('/product/',{params:querydata})

在搜索我得到这些查询参数:

{
  skip: '0',
  limit: '8',
  searchTerm: '',
  filters: '{"minPrice":1,"maxPrice":250000}'
}

但是当我使用过滤器功能时,查询参数会是这样的:

{
Color:'Red',
Type:'Car'
}

当我使用 keyfilter 功能时,我将拥有

{
filters:['red','black','bmw']
}

什么是正确的方法?在我使用 post 来区分过滤器和搜索之前,但现在我正在尝试转换为 rest api。提前致谢。

标签: javascriptrest

解决方案


我的问题是我应该如何以休息的方式分离这些端点?

REST 没有“端点”。它有资源资源标识符

什么是正确的方法?

对于所有这些,您应该使用 GET(请求的语义实际上是只读的),并将您需要的参数嵌入到 URI 的某处。参数应该在 URI 中的哪个位置很大程度上取决于您。

在网络上,我们通常希望选择能够轻松支持网络搜索表单的标识符,这通常意味着将参数描述为键值对列表,因此您最终会得到如下内容:

GET /product/?Color=Red&Type=Car

如果您不需要“正常工作”的 Web 表单,那么您有更多选择来构建资源标识符。您最好的选择是RFC 6570中描述的那些,因为支持 URI 模板的通用库已广泛可用。

从 REST 的角度来看,URI 的实际拼写并不重要,因此您可以选择最适合您需要的拼写。有取舍;您可能会发现您当前的框架更喜欢某些拼写而不是其他拼写,但是对于操作员阅读访问日志或创建从一个资源到另一个资源的相对引用来说,不同的拼写可能会更好。

很多可能性都很好,只要拼写与RFC 3986 中描述的生产规则一致,并且您不要尝试对两种不同的资源使用相同的标识符。


推荐阅读