【问题标题】:problems with dart-server/angulardart and CORSdart-server/angulardart 和 CORS 的问题
【发布时间】:2014-05-28 15:34:37
【问题描述】:

我在我的服务器上使用 dart 和 angulardart 作为我的客户端。我可以通过我的服务器上的 http.get 请求数据,这工作正常 - 但我无法让 POST 工作。

服务器:(服务器使用“Start”https://github.com/lvivski/start

//runs at 127.0.0.1:4040:
server.post("/rest/qr").listen((request) {
  addCorsHeaders(request.response);
  request.payload().then((map) {
    print(map);
  }).then((_) {
    request.response.send("ok");
  });
});

客户端(角度):

// runs at http://127.0.0.1:3030
final String _codesUrl = "http://127.0.0.1:4040/rest/qr";
_http.post(_codesUrl, JSON.encode(temp.toMap())).then((HttpResponse response) {
  print(response.status);
});

添加CorsHeaders:

void addCorsHeaders(Response res) {
    res.header("Access-Control-Allow-Origin", "*, ");
    res.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");}

这是我的代码。正如我已经说过的,从 angular 到我的服务器的 http.get 确实有效。通过 angular http-service fail 发布到我的服务器:“请求的资源上没有 'Access-Control-Allow-Origin' 标头。因此不允许访问 Origin '127.0.0.1:3030'。”

我还尝试了 Google Chrome 中的高级休息插件来向该 URL 发出 POST 请求。这些请求确实有效。我错过了 angulardart POST 请求中的某些内容吗?服务器和客户端在不同的端口上运行。

【问题讨论】:

  • 我前段时间用它来访问一个用 Go 编写的服务器,但我很难让它与 -Allow-Origin", "*, " 一起工作,我改用 "http://127.0.0.1:3030"。您是否验证了 CORS 请求是否到达您的服务器?
  • @GünterZöchbauer 我已经尝试将客户端的 IP 放入源字段。那也失败了。我可以看到客户端发送 POST 请求,但它就像请求根本没有到达服务器一样。有趣的是,我可以通过其他程序向服务器发出请求。顺便说一句,快速回答 Ty。
  • 你不应该在你的帖子请求中使用完整的 URL 吗?我假设您的服务器使用的端口与为您的客户端应用程序服务的 DartEditor 集成服务器不同?
  • @GünterZöchbauer 你是对的。这是客户端/服务器的不同端口。请求的 URL 是 "_codesUrl = "127.0.0.1:4040/rest/qr";" 高级 rest 客户端还显示了我在服务器中设置的 CORS-headers。
  • 但是您问题中的代码没有显示这一点。能否请您更新问题。

标签: dart cors angular-dart


【解决方案1】:

我自己也遇到过这个问题。事实证明,某些 CORS 请求需要“预检请求”。 GET 没有,但 POST 可以。以下文章详细解释了所有这些:

http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server

要点是对于一个 POST CORS 请求,客户端首先会向服务器发送一个“OPTIONS”请求,询问 CORS POST 是否正常。这就是我之前提到的“预检请求”。在收到 POST 之前,您需要抓住它并回复它。

我不确定如何使用 Start 框架回答 OPTIONS 请求,但 dartlang 网站上有一个关于如何使用 vanilla dart 解决确切问题的教程:

https://www.dartlang.org/docs/tutorials/forms/#handling-options-requests

处理 OPTION 请求的代码(摘自上述文章):

void handleOptions(HttpRequest req) {
  HttpResponse res = req.response;
  addCorsHeaders(res);
  print('${req.method}: ${req.uri.path}');
  res.statusCode = HttpStatus.NO_CONTENT;
  res.close();
 }

【讨论】:

  • 今天你是我的英雄!我没有阅读您之前提供的所有这篇文章,但这正是我的问题!我已经向“/rest/qr”添加了一个选项,其中包含一个状态为“200”的空响应,现在我的 Angular 客户端可以将数据发布到该 URL。
  • @Schnebdreleg 但这意味着您必须在添加“OPTIONS”之前已经在服务器上收到 CORS(预检)请求。
  • @GünterZöchbauer 是的,看起来像,但我看不到。使用 Start-Framework 我只用指定的方法监听某些 URL。当我搜索 angular http-service 的请求时,调试器不是很有帮助(或者我不知道在哪里搜索,我还在学习 Dart :))
  • 没有问题,只是为了了解发生了什么。感谢您的回复。
猜你喜欢
  • 2019-06-26
  • 2022-10-13
  • 2019-03-31
  • 2020-05-05
  • 1970-01-01
  • 2021-02-05
  • 2019-01-12
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多