问题描述
am试图配置Web服务器(Haskell,使用Scotty)以响应CORS请求。 Main.hs
的代码在文章末尾,这里是the repo。我已经注释掉了middleware corsPolicy
行。注释掉该行后,服务器会正确响应GET /analytics/hello
和POST /analytics
,它们都使用curl
发送,而后者接受JSON数据,如
{"userName": "jxxcarlson","eventName": "login","eventTime": 12234.77}
GET /analytics/hello
Accept: */*
Status: 200 OK 0.000046s
POST /analytics
Request Body: {"userName": "jxxcarlson","eventTime": 12234.77}
Accept: */*
Status: 200 OK 0.001564s
POST /analytics
Request Body: {"username":"_no_user_","eventName":"signin:attempt","currentTime":1604251628.681}
Accept: */*
Status: 422 Unprocessable Entity 0.000041s
POST /analytics
Request Body: {"username":"jxxcarlson","eventName":"signin:successful","currentTime":0}
Accept: */*
Status: 422 Unprocessable Entity 0.000038s
前两个请求是通过curl
发出的,后两个请求来自浏览器中运行的应用。
以下是将请求发送到服务器的代码:
postWithUser : Maybe User -> String -> Time.Posix -> Cmd FrontendMsg
postWithUser maybeUser eventName currentTime =
Http.request
{ method = "POST",headers = [Http.header "Content-Type" "application/json"],url = Config.analyticsServer ++ "/analytics",body = Http.jsonBody (encodeEventWithUser maybeUser eventName currentTime),expect = Http.expectWhatever AnalyticsDataSent,timeout = nothing,tracker = nothing
}
这是服务器代码:
port :: Int
port = 8080
main :: IO ()
main = do
conn <- connectPostgresql ("host='127.0.0.1' user='jxx' dbname='forscotty' password='jxx'")
scotty port $ do
-- middleware corsPolicy
middleware logStdoutDev
server conn
server :: Connection -> ScottyM()
server conn = do
post "/analytics" $ do
event <- jsonData :: ActionM Event
newItem <- liftIO (insertEvent conn event)
json newItem
get "/analytics/hello" $ do
html . T.pack $ "Yes,I'm still alive"
insertEvent :: Connection -> Event -> IO EventEntity
insertEvent conn event = do
let insertQuery = "insert into events (userName,eventName,eventTime) values (?,?,?) returning id"
[Only id] <- query conn insertQuery event
return $ entityFromEvent id event
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)