如何在REST API搜索查询中返回过滤元数据

时间:2014-02-19 14:20:41

标签: api rest

我目前正在设计和实现PHP中的RESTful API。 API允许用户搜索酒店。

搜索请求的简化示例是:

GET hotels/searchresults?location=<location>     #collection of hotels within location

响应还包含有关返回集合的一些元信息。 回复的基本结构是:

“meta": {
     “totalNrOfHotels": 100,
     "totalNrAvailable": 80
},
“hotels": [
     {
     “id": 123,
     “name": "Hotel A"
     },
     {
     “id": 135,
     “name": "Hotel B"
     },

     ...
]

此资源还支持分页:

GET hotels/searchresults?location=<location>&offset=0&limit=20

现在,有一些过滤器可以应用于搜索结果,例如明星,评分。 例如,如果我只想要2星级酒店,我可以查询:

GET hotels/searchresults?location=<location>&offset=0&limit=20&stars=2

现在,在用于过滤的用户界面中,通常显示每个过滤器设置可用的选项数量:

Stars filter

在我看来,这些数字可以看作是关于搜索查询的元数据。因此,我们可以在响应中为元添加一个额外的字段:

“meta": {
     “totalNrOfHotels": 100,
     "totalNrAvailable": 80
     “filterNrs": {
          "stars”: {
               “1": 1,
               “2”: 9,
               “3”: 39,
               “4”: 12,
               “5”: 11,
               “none”: 9
          }
     }
},
“hotels": [
     {“id": 123,
     “name": "Hotel A"
     },
     {“id": 135,
     “name": "Hotel B"
     },

     ...
]

所以,我有两个问题:

  1. 如上所述,这个“filterNrs”属性是否应该位于meta部分?对我来说,成为一个单独的资源/请求是没有意义的

  2. 我们如何处理这会降低查询速度的事实?我更喜欢将“filterNrs”字段设为可选。我们正在考虑使用“metaFields”参数来允许用户指定她想要收到的元数据中的哪些字段。我们已经为返回的酒店提供了支持,并带有“fields”参数。(类似于:{{3或者,我们将此字段filterNrs(或完整元信息)放在单独的资源中,例如hotels/searchresults/meta。从开发人员的角度来看,您希望将此分割为多个资源或具有单个资源可以选择显示完整或部分元信息吗?

1 个答案:

答案 0 :(得分:0)

每颗星数的评分数是否有所不同?例如,我是否为下面的查询获得了不同的“filterNrs”?

GET hotels/searchresults?location=1
GET hotels/searchresults?location=2

我希望这些过滤器是上下文的,因此不同的位置会为每个星号返回不同的数字,这表明这是与查询相关的某种形式的上下文信息。

否则,如果结果是全局的,则表明它是一个单独的资源。如果它是一个单独的资源场景,您可以使用链接来访问数字及其他详细信息:

“meta": {
     “totalNrOfHotels": 100,
     "totalNrAvailable": 80
     “filterNrs": {
          "stars”: {
               "options" : ["1", "2", "3", "4", "5", "none"],
               "details" : "http://example.com/stars"
          }
     }
},