Haskell 在服务中添加响应头

Haskell 在服务中添加响应头,haskell,servant,Haskell,Servant,我试图弄清楚如何在Servant中添加CORS响应头(基本上,设置一个响应头“accesscontrolalloworigin:*”)。我在下面用addHeader函数编写了一个小测试用例,但它出错了。我将感谢您帮助我找出下面的错误 代码: 我有一个工作版本,它使用了一个更简单的API(simpleGET)。但是,对于上述类型的UserAPI,它会出错addHeader函数类型似乎与我认为的类型签名一致。我肯定遗漏了一些东西,否则就不会出现这样的错误。我认为将CORS头添加到响应的最简单方法是在

我试图弄清楚如何在Servant中添加
CORS
响应头(基本上,设置一个响应头“accesscontrolalloworigin:*”)。我在下面用
addHeader
函数编写了一个小测试用例,但它出错了。我将感谢您帮助我找出下面的错误

代码:


我有一个工作版本,它使用了一个更简单的API(simple
GET
)。但是,对于上述类型的
UserAPI
,它会出错
addHeader
函数类型似乎与我认为的类型签名一致。我肯定遗漏了一些东西,否则就不会出现这样的错误。

我认为将CORS头添加到响应的最简单方法是在servant之上使用中间件。让它变得非常简单:

import Network.Wai.Middleware.Cors

[...]

app ::  Application
app  = simpleCors (serve userAPI server)


对于您的实际响应,我想您需要使用将类型为
Text
的值转换为类型为
Headers'[Header“Access Control Allow Origin”的值。Text
madjar已经建议了这一点,但为了扩展它:
addHeader
更改返回类型:

x :: Int
x = 5

y :: Headers '[Header "SomeHeader" String] Int
y = addHeader "headerVal" y
在您的情况下,这意味着您必须更新
用户的类型,其中绑定返回
ServantErr IO(Headers'[Header“Access Control Allow Origin”T.Text]令牌


一般来说,您可以在ghci中使用
:kind!Server UserAPI
,查看类型同义词扩展为什么-这通常对servant很有帮助!

啊哈,非常有启发性。谢谢!我不明白为什么在添加标头时类型不会更改。它们确实会像您指出的那样更改。这可以用于检索“位置”吗使用servant client时来自GET请求的头?@user239558 yup-只需在响应上使用
getHeaders
getHeadersList
,注意它应该是
y=addHeader“headerVal”x
以上,但由于编辑长度必须为六个字符,因此无法提交此更改。@majdar,非常有用的指针。这可能是我将要采取的路线。我不知道该有用的库,直到您指出它时,我才发现它。
wai cors
感谢您的回答,
simpleCors
正是我现在需要的!
import Network.Wai.Middleware.Cors

[...]

app ::  Application
app  = simpleCors (serve userAPI server)
x :: Int
x = 5

y :: Headers '[Header "SomeHeader" String] Int
y = addHeader "headerVal" y