2011-05-16 99 views
31

我想用查詢參數設計一個RESTful搜索URI。例如,這個URI返回所有用戶的列表:如何使用HATEOAS和查詢參數進行RESTful搜索?

GET /用戶

而且前25個用戶姓氏爲 「哈維」:

GET /用戶?姓氏= Harvey & maxResults = 25

如何使用超媒體來描述「/ users」允許的查詢參數urce?我注意到新的Google Tasks API僅記錄參考指南中的所有查詢參數。我將記錄這份清單,但我也想用HATEOAS來做。

預先感謝您!

+1

我希望我能+10這個問題。 – 2012-06-21 18:56:09

回答

21

使用在URI template spec目前草案中描述的語法,你會怎麼做:

/users{?surname,maxresults} 
+1

URI模板規範看起來非常有用。 – 2011-06-01 21:37:36

6

另一種選擇是使用HTML表單:

<form method="get" action="/users"> 
    <label for="surname">Surname: </label> 
    <input type="text" name="surname"/> 
    <label for="maxresults">Max Results: </label> 
    <input type="text" name="maxresults" value="25"/> <!-- default is 25 --> 
    <input type="submit" name="submitbutton" value="submit"/> 
</form> 

像這樣的形式完全文檔可用的選項和任何默認值,它會創建指定的URL,並且可以使用您關心的其他任何文檔進行註釋。

+2

也許我錯過了這一點,但如果您的資源不是HTML,這將無法正常工作。 – 2012-06-21 18:57:59

+1

這個html表單是制定GET請求的一種方式,你得到的是你要求的任何媒體類型格式...可能(可能會是)完全不同的東西。 – HDave 2012-07-06 18:24:56

1

我沒有休息的專家,但讓我在我的2¢拋出:

在人類的Web,HTML表單經常被用來建立一個URI到搜索結果的表示。問題是,可編程Web沒有形式。但是你可以很容易地定義一些類似的東西你自己,那就是:

  1. 定義介質類型搜索的描述,讓我們說application/prs.example.searchdescription+json(但注意的附言:在這個答案的末尾);

  2. 公開表示搜索用戶的子資源/users/search

第二步將通過從其他地方鏈接到該子資源來實現。例如,假設客戶要求GET /users。它可能會收到這樣的:

{ _links: [ …, { rel: "search", href: "https://stackoverflow.com/users/search" }, …] } 

客戶端可以遵循該鏈接,POST搜索規範到資源的URI,例如:

POST /users/search 
… 
Content-Type: application/prs.example.search-definition+json 
… 

{ criteria: { surname: "Harvey" }, maxResults: 25 } 

這裏,criteria包含的(部分)表示要找到的對象。這可以做成任意複雜的描述。

要請求如上所述,服務器可能然後用狀態碼200 OK回覆,並在實體主體,鏈接,表示對張貼的搜索結果的資源:

{ _links: [ { rel: "results", href: "/users?surname=Harvey&maxResults=25" } ] } 

客戶端可以然後使用results關係導航到URI以獲取搜索結果,而無需自己組裝URI。

P.S.:當我最初寫這篇文章的時候,我還沒有意識到定義新媒體類型會一直存在問題。 Mark Nottingham blogged about "media type proliferation" and how to combat it利用the profile link relation

相關問題