저는 Haskell 초보자입니다.Haskell 및 Yesod에서 오류 상태 반환
Webdav 서버를 Yesod Framework으로 작성하려고 시도했으며 Apache Tomcat 7 소스 코드에서 WebdavServlet
으로 모델링했습니다. 내 기능 중 하나에서 오류를 반환하는 문제가 발생했습니다.
내 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
나는 다음과 같은 오류가 점점 오전 : 나는 책 "Developing Web Applications with Haskell and Yesod"을 통해 검색
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
을하지만, 올바른 유형의 오류를 반환의 예를 찾을 수 없습니다 (Rep...
) .
어떻게 올바른 오류 상태로 RepXmlJson
을 만들려면 어떻게해야합니까? 핸들러의
나는'sendResponseStatus webdavLocked423 $ RepXmlJson (RepXml "") (RepJson "")'에 반환 값을 변경하고 그것을 컴파일합니다. 감사. 좋은 책 이네. – Ralph
'invalidArgs [ "refs"를 해석 할 수 없습니다 "]를 사용하여 400 오류로 응답합니다. 그러나 내 메시지가 어떻게되는지 이해하지 못한다 ... – cies