2014-02-19 29 views
2

我目前正在使用PHP设计和实现RESTful API。 该API允许用户搜索酒店。如何在REST 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”属性静坐在元部分,以上?对我来说,将它作为一个单独的资源/请求是没有意义的

  2. 我们该如何处理这样会降低查询速度的事实?我宁愿使“filterNrs”字段可选。我们正在考虑使用“metaFields”参数来允许用户指定她想要接收的元数据中的哪些字段。我们已经为返回的酒店支持这个参数,并带有“fields”参数(类似于:https://developers.google.com/youtube/2.0/developers_guide_protocol_partial)。或者,我们把这个字段filterNrs(或完整的元信息)放在一个单独的资源中,比如hotels/searchresults/meta。从开发人员的角度来看,你更喜欢将这个分割成多个资源,或者让一个资源具有显示全部或部分元信息?

回答

0

额定是否每星数数不同?比如,我会得到下面?

查询不同的“filterNrs”

我期望这样的过滤器是上下文的,所以不同的位置会返回不同的星号数,这表明这是与查询相关的某种形式的上下文信息。

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

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