我想弄清楚如何在Servant中添加CORS
響應頭(基本上,設置響應頭「Access-Control-Allow-Origin:*」)。我用addHeader
函數編寫了一個小測試用例,但它出錯了。我將非常感謝幫忙解決下面的錯誤。在Servant中添加響應頭
代碼:
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneriC#-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Aeson
import GHC.Generics
import Network.Wai
import Servant
import Network.Wai.Handler.Warp (run)
import Control.Monad.Trans.Either
import Control.Monad.IO.Class (liftIO)
import Control.Monad (when, (<$!>))
import Data.Text as T
import Data.Configurator as C
import Data.Maybe
import System.Exit (exitFailure)
data User = User
{ name :: T.Text
, password :: T.Text
} deriving (Eq, Show, Generic)
instance ToJSON User
instance FromJSON User
type Token = T.Text
type UserAPI = "grant" :> ReqBody '[JSON] User :> Post '[JSON] (Headers '[Header "Access-Control-Allow-Origin" T.Text] Token)
userAPI :: Proxy UserAPI
userAPI = Proxy
authUser :: User -> Bool
authUser u = case (password u) of
"somepass" -> True
_ -> False
server :: Server UserAPI
server = users
where users :: User -> EitherT ServantErr IO Token
users u = case (authUser u) of
True -> return $ addHeader "*" $ ("ok" :: Token)
False -> return $ addHeader "*" $ ("notok" :: Token)
app :: Application
app = serve userAPI server
main :: IO()
main = run 8081 app
這是我的錯誤:
src/Test.hs:43:10:
Couldn't match type ‘Headers
'[Header "Access-Control-Allow-Origin" Text] Text’
with ‘Text’
Expected type: Server UserAPI
Actual type: User -> EitherT ServantErr IO Token
In the expression: users
In an equation for ‘server’:
server
= users
where
users :: User -> EitherT ServantErr IO Token
users u
= case (authUser u) of {
True -> return $ addHeader "*" $ ("something" :: Token)
False -> return $ addHeader "*" $ ("something" :: Token) }
src/Test.hs:46:28:
Couldn't match type ‘Text’ with ‘Headers '[Header h v0] Text’
In the expression: addHeader "*"
In the second argument of ‘($)’, namely
‘addHeader "*" $ ("something" :: Token)’
In the expression: return $ addHeader "*" $ ("something" :: Token)
src/Test.hs:47:29:
Couldn't match type ‘Text’ with ‘Headers '[Header h1 v1] Text’
In the expression: addHeader "*"
In the second argument of ‘($)’, namely
‘addHeader "*" $ ("something" :: Token)’
In the expression: return $ addHeader "*" $ ("something" :: Token)
我有一個簡單的API(簡單GET
)在那裏工作的工作版本。但是,對於上述類型的UserAPI
,則會出錯。我認爲它的功能類型似乎與類型簽名一致。我肯定在這裏錯過了一些東西,否則它不會像這樣錯誤。
aha,我才知道這個有用的庫,非常有教育意義。謝謝!我很困惑爲什麼添加標題時類型不會改變。正如你指出的那樣,它們會改變。 – Sal