Ben bir Haskell acemiyim.Haskell ve Yesod'ta bir hata durumu döndürme
Yesod Framework numarasını kullanarak küçük bir Webdav sunucusunu yazmayı ve Apache Tomcat 7 kaynak kodunda WebdavServlet
'dan sonra modellemeye çalışıyorum. İşlevlerimden bir hata döndüren bir sorunla karşılaştım.
Webdav hizmetim, arayan tarafından gönderilen Accept
başlığının değerine bağlı olarak XML veya JSON döndürmelidir. Benim hizmetlerin dönüş değeri, özellikle lockWebdavR
fonksiyonu olarak bu veri türünü kullanıyorum
import Yesod
data RepXmlJson = RepXmlJson RepXml RepJson
instance HasReps RepXmlJson where
chooseRep (RepXmlJson (RepXml xml) (RepJson json)) = chooseRep
[ (typeXml, xml)
, (typeJson, json)
]
: Ben RepXmlJson
adında bir veri türü tanımlanmıştır. Bir kaynak şu anda kilitli ise bir durum 423 (kilitli) döndürmeye çalışıyorum. Benim kod şöyle görünür:
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
aşağıdaki hatayı alıyorum: Ben kitabın "Developing Web Applications with Haskell and Yesod" aracılığıyla aranır
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
, ancak uygun türde bir hata dönen bir örnek bulamıyorum (Rep...
) .
Doğru hata durumuna sahip bir RepXmlJson
nasıl oluştururum? Bir işleyicinin normal tamamlandığında, her zaman 200 durum koduyla sonuçlanır.
Dönüş değerini "sendResponseStatus webdavLocked423 $ RepXmlJson (RepXml" ") (RepJson" ")' olarak değiştirdim ve derler. Teşekkürler. Btw, güzel kitap. – Ralph
"errorArgs [" Refs ayrıştırılamadı "]' 400 hata ile yanıt vermek için kullanıyorum. Ama mesajıma ne olduğunu anlamadım ... – cies