2016-09-23 55 views
2

假設我的應用程序正在管理名爲工作負載的對象,並帶有以下字段。我想公開一個REST接口供用戶通過標籤查詢工作負載。什麼是使用過濾器查詢的REST式方法?

"Workload": {"id":"test1", "labels":["A", "B", "C"]} 
"Workload": {"id":"test2", "labels":["A", "C", "D"]} 
"Workload": {"id":"test3", "labels":["A", "B", "D"]} 

問題:如何通過多個標籤設計REST端點,以便它支持的查詢工作作爲過濾器?

示例查詢1:我想要GET所有的工作負載都是「A」和「B」。

我在想像GET這樣的動詞,workloads作爲端點,然後使用{"labels": ["A", "B"]}作爲請求主體。但是這看起來並不像RESTful的方式去做事

或者,我可以做GET /labels/{label-id}/workloads但這隻會在每次使用一個標籤時才起作用。

示例查詢2:我想GET所有標籤「A」或「B」,但沒有「C」的工作負載

不知道如何做這樣的REST API的所有,其他要求用戶分別通過A,B,C查詢,然後自己進行適當的設置操作?

第二個查詢是tracked as another question

+0

我不認爲查詢參數有任何問題。你有什麼理由想避免它們? – mrmcgreg

+0

我一直懷疑我是否想要/可以重複查詢參數。當我在'golang'中編寫我的應用程序時,我正在使用[第三方庫'httprouter'](https://github.com/julienschmidt/httprouter)來幫助我自動解析參數,它目前僅支持單個查詢參數...像'工作量/:workload_id/labels /:label_id'這樣的東西# – cookieisaac

回答

1

GET動詞不需要請求體。你應該做一些像'工作量/標籤/ A,B,C'。 然後您可以在請求查詢中獲得A,B,C。用逗號分隔請求查詢並查找記錄。

+0

1.我可以在[URL中使用逗號](http://stackoverflow.com/questions/198606/can-i-use-commas- IN-A-URL)。 2.如何在逗號分隔列表中以「使用標籤」A「或」B「但不包含」C「的工作負載的方式進行查詢? – cookieisaac

+0

@cookieisaac URL中的逗號取決於服務器端路由實現,例如,通過node.js表達你可以有,通過IIS可能會有問題。你需要先測試它。 – inf3rno

1

使用查詢參數its finerepeat them

GET /workloads?label=A&label=B&label=C 

對於簡單的情況下,你也可以ornot的條款是這樣的。

GET /workloads?or_label=A&or_label=B&label_not=C 
+1

這看起來不錯,適合我的情況。只是想知道我是否可以瘋狂並做一些類似'GET /工作負載?(label = A || label = B)&label!= C'?或者是否有我可以做一些基本的邏輯操作,如'(A或B)而不是C' – cookieisaac

+0

你可以嘗試發佈它作爲一個新的問題。我想不出一個明顯的解決方案。也許你需要另外一組資源來定義你的查詢,然後用'GET/queries/{id}/workloads'來得到結果。 –

+0

http://stackoverflow.com/questions/10582066/is-that-可能使用的查詢字符串 –

0

你有很多選擇的唯一約束在這裏,他們應該包含AB。因此,例如

  • /workloads/?label=["A","B"]
  • /workloads/?label[]=A&label[]=B - 又名。 query string array
  • /workloads/by/label/A+B/
  • /label/A+B/workloads/

有現有的URI查詢約定好,例如微軟的OData。 http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html我對OData並不熟悉,但根據文檔,如果你想遵循他們的方法,你應該使用類似/WorkloadsByLabels([email protected])[email protected]=["A","B"]的東西。據我所知。沒有標準的解決方案來描述複雜的URI過濾器。

+0

它看起來像一個合法的解決方案,但我從來沒有見過任何REST API設計的方式......這些傳統的RESTful端點或主要用於URI?我正在思考如[IBM Bluemix REST API](http://ccsapi-doc.mybluemix.net/)這樣的提示,但它們似乎不支持複雜的查詢... – cookieisaac

+0

@cookieisaac如果您正在尋找對於標準解決方案,那麼您應該檢查URI模板https://tools.ietf.org/html/rfc6570。它定義了一個列表類型,它被添加到URI中作爲用逗號分隔的項目。可悲的是,並非每個服務器都支持URI中的逗號,例如IIS有問題。 Afaik加號字符主要用於區分搜索關鍵字而不是單獨列表項,所以它只是一個提示,而不是我所知的慣例。另一方面,URI模板是一個標準,所以如果你的服務器支持,你可以用逗號分隔ID。查詢字符串數組也是標準的。 – inf3rno

相關問題