2012-11-07 32 views
8

में त्रुटि स्थिति लौट रहा है मैं एक हास्केल नौसिखिया हूं।हास्केल और यसोड

मैं 10 का उपयोग कर Webdav सर्वर लिखने की कोशिश कर रहा हूं और अपाचे टॉमकैट 7 स्रोत कोड में WebdavServlet के बाद मॉडलिंग किया गया हूं। मैंने अपने कार्यों में से एक से एक त्रुटि लौटने में एक समस्या में भाग लिया है।

कॉलर द्वारा भेजे गए Accept शीर्षलेख के मान के आधार पर, मेरी वेब सेवा सेवा को एक्सएमएल या जेएसओएन वापस करनी चाहिए।

import Yesod 

data RepXmlJson = RepXmlJson RepXml RepJson 

instance HasReps RepXmlJson where 
    chooseRep (RepXmlJson (RepXml xml) (RepJson json)) = chooseRep 
    [ (typeXml, xml) 
    , (typeJson, json) 
    ] 

मैं अपने सेवाओं के बदले मूल्य, विशेष रूप से lockWebdavR समारोह के रूप में इस डेटा प्रकार का उपयोग कर रहा: मैं 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 कैसे बना सकता हूं?

उत्तर

5

हैंडलर का सामान्य समापन हमेशा 200 स्थिति कोड में परिणाम देता है। इसे ओवरराइड करने के लिए, आपको किसी अन्य तरीके से प्रतिक्रिया भेजनी होगी। आपके मामले में, आप sendResponseStatus आज़मा सकते हैं। अन्य संभावनाएं sendWaiResponse और redirectWith होंगी, हालांकि मुझे संदेह है कि उत्तरार्द्ध उपयोगी होगा।

+0

मैंने वापसी मूल्य को 'sendResponseStatus webdavLocked423 $ RepXmlJson (RepXml "") (RepJson "") में बदल दिया है और यह संकलित करता है। धन्यवाद। बीटीडब्ल्यू, अच्छी किताब। – Ralph

+0

मैं 400 त्रुटि के साथ जवाब देने के लिए 'अवैधअर्स [" रेफर्स पार्स नहीं कर सका "] का उपयोग कर सकता हूं। लेकिन यह नहीं समझता कि मेरे संदेश का क्या होता है ... – cies