亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何設計RESTful搜索/過濾?

如何設計RESTful搜索/過濾?

API
心有法竹 2019-08-06 12:57:58
如何設計RESTful搜索/過濾?我目前正在設計和實現PHP中的RESTful API。但是,我沒有成功實施我的初始設計。GET /users # list of usersGET /user/1 # get user with id 1POST /user # create new userPUT /user/1 # modify user with id 1DELETE /user/1 # delete user with id 1到目前為止標準相當,對嗎?我的問題是第一個問題GET /users。我正在考慮在請求正文中發送參數來過濾列表。這是因為我希望能夠在不獲取超長URL的情況下指定復雜的過濾器,例如:GET /users?parameter1=value1&parameter2=value2&parameter3=value3&parameter4=value4相反,我希望有類似的東西:GET /users# Request body:{    "parameter1": "value1",    "parameter2": "value2",    "parameter3": "value3",    "parameter4": "value4"}它更具可讀性,為您提供設置復雜過濾器的絕佳機會。無論如何,file_get_contents('php://input')沒有返回請求的請求體GET。我也嘗試過http_get_request_body(),但我正在使用的共享主機沒有pecl_http。不確定它會有所幫助。我發現了這個問題,并意識到GET可能不應該有一個請求體。這有點不確定,但他們建議不要這樣做。所以現在我不知道該怎么做。您如何設計RESTful搜索/過濾功能?我想我可以使用POST,但這似乎不太RESTful。
查看完整描述

3 回答

?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

如果您在GET請求中使用請求正文,那么您將違反REST原則,因為您的GET請求將無法緩存,因為緩存系統僅使用URL。

更糟糕的是,您的URL無法加入書簽,因為該URL不包含將用戶重定向到此頁面所需的所有信息

使用URL或Query參數代替請求正文參數。

例如:

/myapp?var1=xxxx&var2=xxxx/myapp;var1=xxxx/resource;var2=xxxx

事實上,HTTP RFC 7231說:

GET請求消息中的有效負載沒有定義的語義;?在GET請求上發送有效負載主體可能會導致某些現有實現拒絕該請求。


查看完整回答
反對 回復 2019-08-06
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

似乎資源過濾/搜索可以以RESTful方式實現。我們的想法是引入一個名為/filters/或的新端點/api/filters/。

使用此端點過濾器可以視為資源,因此通過POST方法創建。這種方式 - 當然 - 身體可用于攜帶所有參數以及可以創建復雜的搜索/過濾器結構。

創建此類過濾器后,有兩種方法可以獲得搜索/過濾結果。

  1. 將返回具有唯一ID的新資源以及201 Created狀態代碼。然后使用此ID GET可以使請求/api/users/如下:

    GET /api/users/?filterId=1234-abcd
  2. 新的過濾器通過創建后POST它將不會與回復201 Created,但在一次與303 SeeOther一起Location頭指向/api/users/?filterId=1234-abcd。此重定向將通過底層庫自動處理。

在這兩種情況下,需要進行兩次請求以獲取過濾結果 - 這可能被視為一個缺點,尤其是對于移動應用程序。對于移動應用程序,我會使用單個POST調用/api/users/filter/

如何保持創建的過濾器?

它們可以存儲在DB中,以后再使用。它們也可以存儲在一些臨時存儲器中,例如redis,并且有一些TTL,之后它們將過期并將被刪除。

這個想法有什么好處?

過濾器,過濾結果可以緩存,甚至可以加入書簽。


查看完整回答
反對 回復 2019-08-06
  • 3 回答
  • 0 關注
  • 1615 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號