Rest Haskell Yesod-执行POST请求时浏览器选项请求的CORS问题
我使用了Rest Haskell Yesod-执行POST请求时浏览器选项请求的CORS问题,rest,haskell,request,cors,yesod,Rest,Haskell,Request,Cors,Yesod,我使用了Network.Wai.Middleware.Cors的simpleCors,它对GET请求正常工作,但是当我尝试发出POST请求时,我遇到了以下问题 OPTIONS /users Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Status: 400 Bad Request 0.032443s 我能够使它工作的唯一方法是从Application.hs中的以下部分删除simpleCo
Network.Wai.Middleware.Cors
的simpleCors
,它对GET
请求正常工作,但是当我尝试发出POST
请求时,我遇到了以下问题
OPTIONS /users
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Status: 400 Bad Request 0.032443s
我能够使它工作的唯一方法是从Application.hs中的以下部分删除simpleCors
-- | Convert our foundation to a WAI Application by calling @toWaiAppPlain@ and
-- applying some additional middlewares.
makeApplication :: App -> IO Application
makeApplication foundation = do
logWare <- makeLogWare foundation
-- Create the WAI application and apply middlewares
appPlain <- toWaiAppPlain foundation
return $ logWare $ defaultMiddlewaresNoLogging $ simpleCors $ appPlain
和添加CORS头。。。但这是一个肮脏的解决方案,因为我需要更改所有API处理程序!非常感谢您的帮助 我认为问题在于它是建立在只包含选项的基础上的,而不包含选项
您可以通过使用相同的方法来滚动所需的任何中间件来解决此问题
以下是我用于解决您描述的选项
问题的方法:
{-#语言重载字符串}
模块中间件在哪里
导入Network.Wai(中间件)
导入Network.Wai.Middleware.AddHeaders(AddHeaders)
导入Network.Wai.Middleware.Cors(CorsResourcePolicy(..),Cors)
--|@x-csrf-token@津贴。
--将设置以下标头:@访问控制允许标头:x-csrf-token@.
allowCsrf::中间件
allowCsrf=addHeaders[(“访问控制允许头”,“x-csrf-token,授权”)]
--|配置了“appCorsResourcePolicy”的CORS中间件。
corsified::中间件
corsified=cors(const$Just-appCorsResourcePolicy)
--|与“corsified”中间件一起使用的Cors资源策略。
--
--此策略将设置以下内容:
--
--*RequestHeaders:@Content-Type@
--*方法如下:@OPTIONS,GET,PUT,POST@
appCorsResourcePolicy::CorsResourcePolicy
appCorsResourcePolicy=CorsResourcePolicy{
corsOrigins=无
,corsMethods=[“选项”、“获取”、“放置”、“发布”]
,corsRequestHeaders=[“授权”,“内容类型”]
,corsExposedHeaders=无
,corsMaxAge=无
,corsVaryOrigin=False
,corsRequireOrigin=False
,corsIgnoreFailures=False
}
然后就像你已经在做的那样,编写你需要的中间件:
run port $ logger . allowCsrf . corsified $ app cfg
简化马里奥的答案,我们可以使用simplePolicy
import Network.Wai.Middleware.Cors
allowCors :: Middleware
allowCors = cors (const $ Just appCorsResourcePolicy)
appCorsResourcePolicy :: CorsResourcePolicy
appCorsResourcePolicy =
simpleCorsResourcePolicy
{ corsMethods = ["OPTIONS", "GET", "PUT", "POST"]
, corsRequestHeaders = ["Authorization", "Content-Type"]
}
使用它:
main = scotty 8080 $ do
middleware allowCors
matchAny "/" $ text "Success"
事实上,我走的是正确的道路,通过与simpleCors实现进行比较,我做了与您相同的事情,但是我使用了corsRequestHeaders=[“授权”,“内容类型”]
而不是corsRequestHeaders=[]
。这部分做什么?另一件事,你用什么IDE/编辑器在Haskell中编码:)?另一件事,我必须添加import Prelude
文档是你的朋友!签出您的项目是否必须在全球范围内排除前奏?我只是使用升华文本或Vim,但这些可能是更一般的问题,适合于无问题的讨论!
main = scotty 8080 $ do
middleware allowCors
matchAny "/" $ text "Success"