如何在Elm Client和Haskell(Yesod)服务器之间发送JSON

jmi*_*ite 8 ajax json haskell yesod elm

我正在尝试从客户端到服务器进行基本的JSON通信,使用以下Elm代码:

import open Http

result res = case res of
    Success a -> a
    Waiting -> "Waiting"
    Failure n a-> "Failure " ++ (show n) ++ " " ++ (show a)


main =   lift asText <| lift (show . result) <|  send <| constant  <| post "http://localhost:3000" "{foo : true}"
Run Code Online (Sandbox Code Playgroud)

服务器完全如Yesod书的这一部分所示.

但是,当我运行请求时,我得到了输出

"\"Failure 0 []\""
Run Code Online (Sandbox Code Playgroud)

有没有人知道我要做些什么来让Elm客户端与Yesod服务器正常通信?我尝试过一个Python客户端,请求工作得很好.同样,在Yesod网站上有几个成功的Http请求的例子,所以我相信两个库都正常工作,但我使用它们是错误的.

更新:问题是客户端.我能够使用Chrome并禁用安全选项,并且不对Yesod进行任何更改.我会寻找一种解决方法,但这至少足以让我的开发继续下去.

mgo*_*old 8

这是由某些站点上的跨站点脚本安全功能引起的.它最近出现在榆树邮件列表上(由我).如果您致力于使用特定服务器,目前还没有解决方法,尽管我很幸运托管了这些文件elm-server,这些文件托管了您运行它的目录中的所有文件.

您应该检查javascript控制台,你会看到类似的东西XMLHttpRequest cannot load http://www.google.com/. Origin http://localhost:8000 is not allowed by Access-Control-Allow-Origin..如果你不这样做,那么这是一个全新的问题.但我对此表示怀疑.


Nik*_*asN 5

我想你的服务器需要发送CORS-header,在这篇SO帖子的例子中讨论:在Yesod中允许跨源请求

有关MDNWikipedia中 CORS的更多信息

请注意,如果浏览器认为您正在进行跨源请求

  • 域名不同,例如,您尝试从foobar.com获取数据,在您的浏览器位置,您有barfoo.com
  • 子域名不同,例如您的应用程序位于foobar.com,并且您尝试从api.foobar.com获取数据
  • 端口不同,例如您的浏览器应用程序在localhost:8000中,并且您尝试从localhost:8001获取数据