我最近一直在尝试构建一个与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客户端。
非常感谢!
答案 0 :(得分:3)
当您的客户端应用程序从与docker服务器不同的服务器提供时,会发生这种情况。这是一个浏览器问题,不是Dart特有的。幸运的是,解决方案很简单。
请务必在每次请求时从服务器发送CORS标头。解决此问题的最简单方法是添加以下标题:
Access-Control-Allow-Origin: *
我不知道Redstone的细节,但请务必在Access-Control-Allow-Origin
,*
和{{1}上设置标题键GET
和值HEAD
}} 方法。是的,您需要在POST
个请求上设置此标头,因为有时浏览器会执行HEAD请求以检查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 serve
和pub 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
中详细了解拦截器