我有一個表單https://example.com/order/,我想在提交后驗證服務器端。如果它有效,我希望瀏覽器導航到https://example.com/summary/. 如果它無效,我想回傳一條錯誤訊息并停留在同一頁面上。
我知道如何在兩個請求中做到這一點(例如,回傳一個 HTTP 302 重定向而不是帶有頁面內容的 HTTP 200),但我只想用一個請求來完成它,因為兩個請求對于這樣一個簡單的任務來說似乎太多了。
在我的研究中,我發現了兩種可能的解決方案,都非常糟糕:
使用 JavaScript 提交表單并處理回應。如果回應是 HTTP 400,則處理錯誤的顯示。如果回應是 HTTP 200 - 用回應的正文替換整個 HTML 檔案,更新頁面的地址和瀏覽器的歷史記錄。
我不喜歡這個解決方案,因為對于這樣一個簡單的任務來說它似乎太復雜了,我不確定是否可以洗掉已經加載并正在運行的腳本。想象一下,
<script>setInterval(() => {console.log("side-effect")}, 1000);</script>在 HTML 代碼中有類似的東西,即使在我執行之后它也會繼續運行document.open(); document.write(response); document.close();。將表單的操作設定為直接發布到
/summary/. 如果表單有效,則回傳帶有頁面內容的 HTTP 200,頁面將正確加載。如果表單無效,則回傳 HTTP 204 No Content - 這將導致瀏覽器停留在同一頁面上。然后我可以在 cookie 或其他一些回應頭中包含錯誤詳細資訊(HTTP 204 不允許回應包含正文)。我更討厭這個,因為這會違反客戶端-服務器 HTTP 通信背后的許多規則,濫用 HTTP 204 狀態。如果有類似的 HTTP 錯誤回應狀態指示瀏覽器停留在同一頁面上并允許回應正文,那就太好了。
那么有沒有辦法通過單個請求做到這一點,同時保持符合標準和無副作用?
uj5u.com熱心網友回復:
不,瀏覽器對 204 的支持很糟糕(你只會看到一個白屏),而且沒有辦法通知用戶出了什么問題。204 甚至不適合您的情況,因為您想在出現錯誤時使用它,但 204 是成功狀態。
在過去,我們只會在結果頁面上顯示全屏錯誤,并要求用戶按后退按鈕。瀏覽器保留表單值,以便他們可以在不丟失整個表單的情況下糾正錯誤。
在大多數情況下,執行 2 個請求是一個好主意,您有點想將資料提交到服務器,然后在獲得303狀態代碼后重定向到新頁面。如果不這樣做,用戶將在按下后退按鈕時重新提交表單,這幾乎總是不可取的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311243.html
標籤:javascript html 形式 http
下一篇:如何防止表單欄位被清除?
