2017-10-17 35 views
4

什麼是使僕人處理程序以重定向響應的適當方式?我正在導航REST應用程序中工作,我想響應POST請求,通過重定向到相應的GET資源列表路徑創建資源。因此,例如POST/foos應在創建foo後重定向到GET/foos。我無法在文檔中找到明確的方法。僕人中的重定向

+1

我個人認爲這不是好的做法。 POST本身應該返回數據(用服務器填充的ID等)。否則,您會強制客戶端無理由再執行一次HTTP請求。 – mb21

+1

如果我這樣做,瀏覽器將顯示錶單重新發送的警報,如果我在表單提交後單擊刷新並且創建操作已返回新的html內容。 – Jesuspc

+0

啊,是的,我可以看到這對於基於表單的HTML API是有意義的......我在想JSON。 – mb21

回答

5

有一個簡單的(但有點冒險的)答案,並且使得第一個選項過時(編輯:和第三個,更好的選項,實際上)。

這個目前典型的解決方案是簡單地使用該Handler單子有MonadError ServantErr實例的事實,那ServantErr是一個非常普遍的「反應型」確實可以描述爲一個應用程序錯誤的HTTP響應,但也重定向或其他許多事情。所以你可以做點像throwError $ err301 { errHeaders = [("Location", "https://haskell.org/")] }。這很醜陋,因爲我們劫持了一些成功的工作流程的「錯誤」位。但它有效,並且是一行代碼。

我已經探索了其他方法,可以讓您將類型安全的鏈接與重定向混合在一起,輕鬆地重定向到您應用的其他端點/頁面。現在已經過時,但可能可以在沒有太多麻煩的情況下工作。

在看到這個問題時,我剛纔想到了第三個選項。花了一點時間來試驗它,看起來像是有效的!您可以通過在this gist中使用它的示例查看代碼。如果您有任何問題,請告訴我。我們可能想將這些添加到僕人。如果您認爲這已經足夠好,請隨時在問題跟蹤器中提出。這種方法的要點是定義一個自定義的PostRedirect,它具有正確的形狀(沒有響應主體,具有您選擇的類型的位置標題,以及您希望重定向使用的狀態代碼參數化)以及一個小函數在返回之前適當地包裝位置。

+0

謝謝!我認爲這對僕人來說是一個很好的補充。 – Jesuspc