2017-02-24 59 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。