' XMLHttpRequest无法加载'从Dart客户端到本地Dart docker服务器的HTTP请求出错

时间:2014-12-09 00:52:06

标签: xmlhttprequest dart httprequest

我最近一直在尝试构建一个与Dart docker服务器通信的Dart客户端。如果我在任何浏览器上运行此URL(localhost:8080 / id / 6192449487634432),我会返回我已设置的JSON,但是,如果使用

HttpRequest
    .getString ("http://localhost:8080/id/6192449487634432")
    .then (print);
在Dart客户端上,我得到了这个奇怪的错误

XMLHttpRequest cannot load http://localhost:8080/id/6192449487634432. No 'Access-Control-Allow-Origin' 
header is present on the requested resource. Origin 'http://localhost:8081' is therefore not allowed access.

我已经搜索了一些变通方法来构建PHP代理(不,谢谢)。我是一般的Web开发新手,我绝对不知道代理是什么或如何构建代理。我可以用一个干净的解决方案吗?我有一个Redstone服务器和AngularDart客户端。

非常感谢!

3 个答案:

答案 0 :(得分:3)

当您的客户端应用程序从与docker服务器不同的服务器提供时,会发生这种情况。这是一个浏览器问题,不是Dart特有的。幸运的是,解决方案很简单。

请务必在每次请求时从服务器发送CORS标头。解决此问题的最简单方法是添加以下标题:

Access-Control-Allow-Origin: *

我不知道Redstone的细节,但请务必在Access-Control-Allow-Origin*和{{1}上设置标题键GET和值HEAD }} 方法。是的,您需要在POST个请求上设置此标头,因为有时浏览器会执行HEAD请求以检查CORS是否已启用。

http://enable-cors.org/

了解有关CORS的更多信息

答案 1 :(得分:2)

如上所述,设置Access-Control-Allow-Origin标头允许来自浏览器的HTTP请求转到除客户端加载源之外的其他URL。另一种选择是从您访问的同一服务器上为Dart客户端提供服务。

取决于您的环境以及您使用的是Dartium还是JavaScript浏览器

如果您在App Engine托管虚拟机上使用Dart,我们内置了对此的支持,以便在开发期间将客户端文件的请求代理到pub serve,并从pub build的输出提供服务部署时请参阅A Client-Server Example

如果您现在正在运行普通的Dart服务器,则没有用于在pub servepub build之间切换的固定解决方案。您可以运行pub build并从web/build目录中提供文件。

我们正致力于在App Engine托管虚拟机上为Dart提供更普遍可用的解决方案。

答案 2 :(得分:1)

特别是对于redstone,您可以按如下方式解决问题。将此代码段添加到服务器端代码

// if not yet there
import 'package:redstone/server.dart' as app;

@app.Interceptor(r'/.*')
  interceptor() {
  app.chain.next(() {
    app.response = app.response.change(headers: {
      "Access-Control-Allow-Origin": "*"
    });
  });
}

您可以在redstone wiki

中详细了解拦截器