2014-11-25 41 views
0

我正在開發基於HAL規範的REST API。 API正在使用Symfony在PHP中開發,客戶端正在構建在angularjs中。 API必須返回一些列表,它們將使用ngtables library來顯示,並且需要過濾選項,理想情況下采用ngtables使用的格式,如this sample將鍵值傳遞給RAL API中的鍵值以下HAL

{ "name": "M", "age": "4" } 

(當然未來的客戶可能會使用相同的選項。)

我的前端,同事是在暗示我直接發送編碼爲URL參數的JSON,像這樣:

?filter=%7B%20%22name%22%3A%20%22M%22%2C%20%22age%22%3A%20%224%22%20%7D%20 

雖然我不太確定。

我一直在閱讀如何通過URL發送數組,如param[]=foo&param[]=bar,但這確實意味着有多個值的一個鍵。在我的情況下,我需要能夠像Json對象那樣爲數組發送不同的鍵值。

我想知道客戶端的請求URL應該如何包含所有過濾器選項在一個參數中,以及是否有任何標準的方法來做到這一點。

EDITED:@Ross_Turner之後我想澄清一下,我在參數中傳遞一個鍵值數組的意圖是因爲我們會有另一種類型的參數。例如:

?filter=<my key-value array>&page=1&limit=50&anotherParam=whatever 

即使我們想使用含有另一鍵值數組一次像這樣的參數:

?filter=<my key-value array>&sorting=<another key-value array>&page=1&limit=50 

filtersorting可以有相同的密鑰。

回答

1

目前在GET請求中沒有標準的方式發送查詢。所以你有兩個選擇:你使用你的自定義查詢語言(就像你已經嘗試過)或者你選擇一個標準的查詢語言。無論哪種方式,都很難使其成爲RESTful,因爲您必須創建一個鏈接,其中包含如何生成這樣的URI的配方。你也許可以使用URI templates,但有時卻是不夠的一般... ...

@Ross特納:

我想你誤會了,我說的是沒有一個標準。 OFC。有非標準的基於查詢字符串的解決方案,例如RQL。或者您可以在單個參數中發送標準SPARQL查詢,但沒有標準的方式來描述這樣的鏈接,並且沒有鏈接描述,您無法在REST客戶端中生成查詢,因此它不會鬆散耦合,因此它將違反統一的接口約束。

0

我不同意@ inf3ero的答案 - 確實有一個非常明確的方式發送查詢作爲GET請求的一部分 - 查詢參數。如果你想要不同的鍵和值組合,這是查詢參數的鍵和值的主體,所以在你的例子中,你應該使用?name=M&age=4並在你的服務器上解析每一個。它應該很簡單,通過遍歷JSON對象中的鍵來將

{ "name": "M", "age": "4" } 

轉換爲此。我不確定爲什麼如果您試圖在HAL規範之後實現RESTful API,您會希望將它們組合到一個參數中。

+0

我剛剛編輯我的問題,試圖澄清爲什麼我試圖發送一個鍵值數組內的參數,能夠允許這樣的請求'?filter = <我的鍵值數組>&排序= <另一個鍵-value array>&page = 1&limit = 50'其中'filter'和'sorting'可以有相同的鍵。 – 2014-11-25 13:05:15

+1

啊我現在看到,在這種情況下,您仍然只需要鍵和值的參數,你希望過濾,這應該意味着只有排序是問題,因爲你需要指定的鍵,無論是上升和下降,並在哪個命令。如果你必須支持多個排序值,比如'?name = M&age = 4&sortBy = name + asc,age + desc'。 我強烈建議您使用過濾鍵和值作爲GET請求上的查詢參數,因爲這是查詢RESTful資源的一種相當標準的方式。 – 2014-11-25 13:15:53

+0

謝謝@RossTurner。如果使用另一個參數如'?page = 1&limit = 50',怎麼辦?將「name」或「age」設置在同一級別是否正確? – 2014-11-25 13:25:09

相關問題