使用 http post flutter web 时出现 XMLHttpRequest 错误

XMLHttpRequest error while using http post flutter web

我在对 API-AWS API 网关进行 HTTP post 调用时遇到此错误 XMLHttpRequest error.。我当前的流程是 Flutter web -> API gateway -> lambda -> rds.

我知道这个 已经有几个 question-related 但正如其中一个答案所建议的那样,添加一些 headers 以响应 lambda。但它对我不起作用。

经过一些研究,我发现问题与 CORS 有关。现在在 chrome 中禁用 cors 是一个临时修复,并在此 .

中提出建议

我研究后发现的一些其他解决方案建议在我的 API 中启用 cors 并且在前端部分我添加了 headers 但其中 none 有效。

fetchData() async {
    String url =
        "myUrl";
    Map<String, String> headers = {
      "Access-Control-Allow-Origin": "*", // Required for CORS support to work
    };
    String json = '{"emailId":"emailId"}';
    http.Response response =
        await http.post(Uri.parse(url), headers: headers, body: json);
    print(response.body);
    return response.body;
  }

解决这个问题的正确方法是什么?

我已经解决了我的问题,但不会删除这个问题,因为这个问题的 well-defined 解决方案不多。 对于使用 flutter web 和 AWS 的 Future 查看器 API-gateway.

  1. 如果你遇到这个问题,这意味着它来自后端而不是来自 flutter 端
  2. XMLHttpRequest 错误。是由于 CORS

您必须在 api-gateway 中启用 CORS 的问题的解决方案遵循此 link

但是如果您使用与 lambda 和 api-gateway 的代理集成,那么在这种情况下启用 CORS 将无济于事,您必须从 lambda 函数的响应中传递 headers。喜欢

return {
    statusCode: 200,
     headers: {
  "Access-Control-Allow-Origin": "*", // Required for CORS support to work
  "Access-Control-Allow-Credentials": true, // Required for cookies, authorization headers with HTTPS
  "Access-Control-Allow-Headers": "Origin,Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,locale",
  "Access-Control-Allow-Methods": "POST, OPTIONS"
},
    body: JSON.stringify(item)
};

格式需要相同。另外,一个对我理解整个问题有很大帮助的特定问题是通过问题 link.

的各种答案。

现在我的问题来了,我做错了什么我从前端传递 "Access-Control-Allow-Origin": "*", 并在 API 网关中启用 CORS 也发送类似的 headers 正在创建一个我的问题

Access to XMLHttpRequest at 'API-URL' from origin 'http://localhost:63773' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.  //this particular line

因此,在将我的函数更改为此后,一切正常

fetchData() async {
    String url =
        "API-url";
    Map<String, String> headers = {
      "Content-Type": "text/plain",
    };
    String json = '{"emailId":"emailId"}';
    Map<String, String> map = Map();
    map["emailId"] = "fake@gmail.com";
    http.Response response = await http
        .post(Uri.parse(url), headers: headers, body: jsonEncode(map))
        .then((value) {
      print("onThen> " + value.body.toString());
    }).onError((error, stackTrace) {
      print("onError> " +
          error.toString() +
          " stackTrace> " +
          stackTrace.toString());
    });
  }

1- 转到 flutter\bin\cache 并删除名为:flutter_tools.stamp

的文件

2- 转到 flutter\packages\flutter_tools\lib\src\web 并打开文件 chrome.dart。

3- 查找“--disable-extensions”

4- 添加“--disable-web-security”

您的后端表单中一定缺少注释,或者您的 UI 中的映射可能做错了(例如匹配列名)。您还可以使用 swagger 查找错误。