私はHaskell初心者です。HaskellとYesodのエラーステータスの返信
WebdavサーバをYesod Frameworkで作成しようとしており、Apache Tomcat 7のソースコードのWebdavServlet
の後にモデル化しました。私は私の機能の1つからエラーを返す問題にぶつかってきました。
私のwebdavサービスは、呼び出し元によって送信されたAccept
ヘッダーの値に応じて、XMLまたはJSONのいずれかを返す必要があります。私は私のサービスの戻り値は、具体的にlockWebdavR
関数として、このデータ型を使用しています
import Yesod
data RepXmlJson = RepXmlJson RepXml RepJson
instance HasReps RepXmlJson where
chooseRep (RepXmlJson (RepXml xml) (RepJson json)) = chooseRep
[ (typeXml, xml)
, (typeJson, json)
]
:私はRepXmlJson
と呼ばれるデータ型を定義しました。私はリソースが現在ロックされている場合、ステータス423(ロックされた)を返そうとしています。私のコードは次のようになります。
import qualified Data.ByteString as B
import qualified Data.Map as M
import qualified Data.Text as T
import qualified Network.Wai as W
mkYesodSub "Webdav" [] [parseRoutes|
/WebdavR COPY DELETE LOCK MKCOL MOVE OPTIONS PROPFIND PROPPATCH PUT UNLOCK
|]
type WebdavHandler yesod = GHandler Webdav yesod
webdavLocked423 :: Status
webdavLocked423 = Status 423 "Locked"
isLockedRequest :: Yesod master => Request -> WebdavHandler master Bool
-- isLockedRequest definition omitted for brevity
lockWebdavR :: Yesod master => WebdavHandler master RepXmlJson
lockWebdavR = do
request <- getRequest
locked <- isLockedRequest request
if locked
then return $
W.responseLBS webdavLocked423 [("Content-Type", "text/plain")] ""
else return undefined
私は、次のエラーを取得しています:
Webdav.hs:94:10:
Couldn't match expected type `RepXmlJson'
with actual type `W.Response'
Expected type: GHandler Webdav master RepXmlJson
Actual type: GHandler Webdav master W.Response
In the expression:
return
$ W.responseLBS webdavLocked423 [("Content-Type", "text/plain")] ""
In a stmt of a 'do' block:
if locked then
return
$ W.responseLBS webdavLocked423 [("Content-Type", "text/plain")] ""
else
return undefined
私は本"Developing Web Applications with Haskell and Yesod"経由で検索、しかし、適切な型(Rep...
)のエラーを返すの例を見つけることができません。
RepXmlJson
を正しいエラーステータスで作成するにはどうすればよいですか?
戻り値を 'sendResponseStatus webdavLocked423 $ RepXmlJson(RepXml" ")(RepJson" ")'に変更し、コンパイルします。ありがとう。ところで、素敵な本。 – Ralph
私は 'invalidArgs [" refs "を解析できませんでした"]を使用して400エラーで応答します。しかし、私のメッセージに何が起こるのか理解していない... – cies