在搜尋表單中發布或獲取?
我創建了一個搜尋表單來查找 MVC 站點上的文章。
表單類型應該是 POST 還是 GET?
我知道被獲取可以為搜尋添加書籤等等。
使用 GET 有什麼缺點嗎?
謝謝你,米格爾
使用
GET動詞,參數將在 上URL,沒有 http 請求正文GET。使用POST可能不是合適的解決方案,如果我們在 URL 上也有參數,但我們可以以特定格式(json、xml、文本等)將更多數據發送到請求正文中。正如動詞名稱所說,使用GET它是最好的解決方案,您還可以獲得複制/粘貼此 url 並在任何地方共享的好處。http 的 URL 上的參數沒有限制。HTTP 協議對 URI 的長度沒有任何先驗限制。伺服器必須能夠處理它們所服務的任何資源的 URI,並且如果它們提供可以生成此類 URI 的基於 GET 的表單,則應該能夠處理無限長度的 URI。如果 URI 比伺服器可以處理的長(參見第 10.4.15 節),伺服器應該返回 414(Request-URI Too Long)狀態。
但正如 Jasen 評論,瀏覽器可以有限制。
無論如何,請記住使用方法 do Avoid
sql injection。如果您要使用ado.net,請使用Parameters。如果您正在使用它,ORM它會照顧您。
儘管
GET查詢數據是更傳統的解決方案,但在很多情況下 aGET過於受限而無法執行 a/search。問題的本質是a
GET沒有請求主體,因此它無法處理更複雜的請求。本質GET上只能使用 URL 發送數據。URL 可以包含路徑參數和查詢參數,它們只是一組鍵值對,其中鍵和值都是一個string類型。相比之下,
POST罐頭還可以在其主體中攜帶整個 JSON 文件。通過將自己限制為 aGET,我們無法使用任何這些 JSON 功能,因此我們無法將正確的對像或數組發送到我們的後端。語義到底有多重要?我們是否應該遵循可能導致技術債務的變通辦法,只是為了遵守命名約定?
一個問題案例的例子
如上所述,可能的問題之一是它無法處理數組。
例如,在網上商店中,您希望使用者展示以列表形式呈現的產品目錄。您希望讓您的使用者能夠使用複選框來選擇多個供應商來過濾列表。它會產生一個數組,例如
selectedVendors = ["vendorA", "vendorB"].如果我們想遵守使用 a 的約定
GET,那麼我們必須找到一個可接受的解決方法,它允許我們在不使用請求正文的情況下將供應商列表發送到後端。解決方法 1
只需使用查詢參數,就可以將其建模為一堆布爾值:
includeVendorA,includeVendorB, …不幸的是,這很難維護,也很難記錄。
解決方法 2
前端實際上可以執行多個查詢。IE
- 首先獲取 vendorA 的(
/search?vendor=VendorA),- 然後是 vendorB (
/search?vendor=VendorB)- 然後最後將所有結果合併到一個列表中。
首先,它有性能損失,因為它需要多次往返。但其次,它也破壞了支持分頁的能力。
解決方法 3
將增量索引添加到您的查詢參數名稱。(例如
/search?vendor1=VendorA&vendor2=VendorB)同樣,難以記錄,OpenAPI 也不支持。
最後
如果我們可以接受 a
POST更適合 a/search,那麼我們不需要任何這些變通方法。2021 年更新
專門用於發送數組 over
GET,目前還沒有標準。然而,緩慢的框架和語言正在轉向事實上的標準:/search?vendor[]=VendorA&vendor[]=VendorB.的一個更具體的缺點
GET是能夠對條件過濾器進行建模:(例如,在工單系統中:“給我 X 創建的所有工單和 X 關閉的所有工單”,或者在網路商店中:“給我所有打折的產品和所有免費送貨的產品”)。它們轉換為混合使用AND和OR語句的數據庫查詢。