2012-11-07 14 views
8

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.

cevap

5

Bunu geçersiz kılmak için başka bir şekilde bir cevap göndermelisiniz. Durumunuzda, sendResponseStatus deneyebilirsiniz. Diğer olasılıklar, sendWaiResponse ve redirectWith olacaktır, ancak bu durumun yararlı olacağını sanmıyorum.

+0

Dönüş değerini "sendResponseStatus webdavLocked423 $ RepXmlJson (RepXml" ") (RepJson" ")' olarak değiştirdim ve derler. Teşekkürler. Btw, güzel kitap. – Ralph

+0

"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

İlgili konular