Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest Haskell Yesod-执行POST请求时浏览器选项请求的CORS问题_Rest_Haskell_Request_Cors_Yesod - Fatal编程技术网

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"