2017-02-24 24 views
2

我正在使API更加RESTful。目前,我有一个这样的端点:资源URL中的RESTful查询字符串

/booking?bookingid=123 

我已经更新了终端更REST风格是这样的:

/bookings/123 

一个预订看起来有点像这样:

{ 
    "bookingId":123, 
    "people":[ 
     { 
     "personId":0, 
     "name":{ 
      "forename":"Jon", 
      "surname":"Smith" 
     } 
     }, 
     { 
     "personId":1, 
     "name":{ 
      "forename":"Sarah", 
      "surname":"Jones" 
     } 
     } 
    ] 
} 

如果预订中包含特定的姓氏,我只想返回预订,如果预订中不存在姓氏,则返回“未找到”。

我期待来实现,这是通过添加查询字符串的方式:

/bookings/123?surname="Jones" 

这将返回上面的预订萨拉的姓氏是“奇兵”的预订也将与查询字符串返回姓“,价值”史密斯“。

的第一个问题我有是,如果的属性添加到预订目标,它看起来像查询是针对和其他问题我已经是它的查询针对一个单一的实体,而不是一个列表,这是一个RESTful方法,如果不是,那么什么是更好的方法?

+0

你能详细说明你的问题吗?我发现很难遵循 – Coder

+0

为什么要将姓氏属性添加到预订对象? –

+0

@Coder问题不是技术问题,只是我的方法是否是RESTful。 – Calum

回答

3

社区没有定义“RESTful”。

与“RESTful”的定义最接近的是Roy T. Fielding的Architectural Styles and the Design of Network-based Software Architectures,该论文引入了术语“REST”。本文没有一个关于如何构建“RESTful”URL的单词。相反,这个想法是,服务器选择适合它的任何URL,然后在超媒体链接中将它们明确地传达给客户端。在这种“RESTful”系统中,/booking?bookingid=123是一个非常好的网址,因为它是/_content/AcmeWebApi.dll?ENDPOINT=booking&ID=123&tc=y

但是,在这篇论文(以及“REST”一词)获得广泛认可之后,社区很快从“休闲”这个概念转移到了一系列其他相互矛盾的观点,即什么是或不是“ REST“,到great dismay of Roy T. Fielding

因此,你的问题不能得到有用的回答。

考虑一下,如果“RESTfulness”真的是你想优化的属性,或者如果你是一些其他属性,这可能是之后,例如:由客户端

  • 便于理解实施者
  • 与像HTTP缓存部署的组件的互操作性
  • 服务器的自由更改网址在未来
  • 是像X公司的API

和每个可能需要不同的URL设计。

1

使用查询参数筛选单个资源并不常见,但它符合the spec。您可能希望您的过滤器名称为?person-surname=,以便稍后为自己留出灵活性。您也可以考虑过滤集合(/bookings?person-surname=)是否更有意义并返回所有匹配的预订。

1

当您直接通过id访问资源(即/ booking/123 /)之后,quering可能不是最佳选项。当你指定资源的UID [你肯定知道这个资源存在]并且期待一个“Not Found”是不合适的。

我建议让查询更统一一点,并保留规定在单个url参数中添加更多的参数。

/bookings?query="param1=value1 AND param2=value2" 

在上述过程中encording网址PARAM将是最好的选择,因此这将是

/bookings/123?query="param1%3Dvalue1%20AND%20param2%3Dvalue2" 

这里参数1可与值123和参数2可以是surename您预订ID你需要的价值。

现在问题是param2(即确定名称)不是资源的直接属性,所以你会考虑使用下面作为更多的改进版本。

/bookings?query="bookingId=123 AND people.surename=myname" // in your case people.name.surename 

另外,还要注意的是,你需要两个参数1和参数上面,如果你只是通过第二PARAM booking.people.name.surename有人能想到它会返回所有的室内用预约者与价值surename。