【问题标题】:Servant-options does not handle OPTIONS request仆人选项不处理 OPTIONS 请求
【发布时间】:2021-09-26 03:45:45
【问题描述】:

我正在使用如documentation 中所述的servant-options 包:

type RepositoryAPI = "repository" :> Get '[JSON] Repository 

getRepository :: Handler Repository
getRepository = do
  repository <- liftIO loadRawRepositoryFromFilesystem 
  return repository

server :: Server RepositoryAPI 
server = getRepository 

repositoryAPI :: Proxy RepositoryAPI 
repositoryAPI = Proxy

app :: Application
app = logStdoutDev
  $ cors (const $ Just policy)
  $ provideOptions repositoryAPI 
  $ serve repositoryAPI server
    where policy = simpleCorsResourcePolicy { 
          corsMethods = ["OPTIONS", "GET", "PUT", "POST"],
          corsRequestHeaders = [ "Authorization", "Content-Type" ] 
    }

main :: IO ()
main = run 8081 app

但是对 URL 的 OPTIONS 请求仍然返回错误 400:

OPTIONS /repository
  Accept: */*
  Status: 400 Bad Request 0.000039136s

我做错了什么?尝试了不同的策略配置(没有“授权”或没有 corsMethods 或使用小写“内容类型”),但仍然没有运气。这可能是我需要在前端处理的事情吗?任何建议表示赞赏。

【问题讨论】:

    标签: haskell cors servant


    【解决方案1】:

    问题出在前端。我必须使用d3.json 方法进行以下调用:

    json("http://localhost:8081/repository", 
        {method: 'GET', headers: new Headers(
             [['Access-Control-Request-Headers', "content-type"]]
        )}
    )
    

    以前我在做以下事情:

    json("http://localhost:8081/repository", 
        {method: 'GET', headers: new Headers(
             [['Access-Control-Allow-Origin', "*"]]
        )}
    )
    

    所以现在一切正常。

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 2013-04-13
      • 2016-07-27
      • 2010-09-18
      • 1970-01-01
      • 2018-07-24
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多