8

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

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}"

服务器与 Yesod 书的这一部分完全一样。

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

"\"Failure 0 []\""

有人知道我必须做什么才能让 Elm 客户端与 Yesod 服务器正确通信吗?我试过一个 Python 客户端,请求工作得很好。同样,Yesod 站点上有几个成功的 Http 请求的示例,所以我相信这两个库都可以正常工作,但我使用它们是错误的。

更新:问题出在客户端。我能够在禁用安全选项的情况下使用 chrome,并且对 Yesod 没有任何更改。我会寻找一种解决方法,但这至少足以让我的开发继续进行。

4

2 回答 2

8

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

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

于 2013-09-06T03:21:01.307 回答
5

我猜您的服务器需要发送 CORS 标头,在此 SO 帖子中的示例中进行了讨论:Allowing cross-origin requests in Yesod

MDNWikipedia中有关 CORS 的更多信息

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

  • 域名不同,例如您尝试从 foobar.com 获取数据,而在您的浏览器位置中,您有 barfoo.com
  • 子域不同,例如您的应用程序位于 foobar.com 中,而您尝试从 api.foobar.com 获取数据
  • 端口不同,例如您的浏览器应用程序位于 localhost:8000 中,而您尝试从 localhost:8001 获取数据
于 2014-12-17T18:57:16.367 回答