使用http postflutter web时出现XMLHttpRequest错误

Posted

技术标签:

【中文标题】使用http postflutter web时出现XMLHttpRequest错误【英文标题】:XMLHttpRequest error while using http post flutter web 【发布时间】:2021-07-19 01:40:29 【问题描述】:

我在对我的 API-AWS API 网关进行 HTTP 发布调用时遇到此错误 XMLHttpRequest error.。我目前的 Flow 是 Fl​​utter web -> API gateway -> lambda -> rds。

我知道已经有几个与此 like 相关的问题,但正如其中一个答案所建议的那样,添加一些标题以响应 lambda。但它对我不起作用。

在做了一些研究后,我发现问题与 CORS 有关。现在在 chrome 中禁用 cors 是一个临时修复,并在此 question 中提出建议。

我在研究后发现的一些其他解决方案建议在我的 API 中启用 cors,并且在前端部分中我添加了标头,但它们都不起作用。

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;
  

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

【问题讨论】:

能否请您添加您的 lambda 函数 【参考方案1】:

1- 转到flutter\bin\cache 并删除一个名为:flutter_tools.stamp 的文件

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

3- 查找'--disable-extensions'

4- 添加'--disable-web-security'

【讨论】:

【参考方案2】:

我已经解决了我的问题,并且不会删除这个问题,因为这个问题没有很多明确的解决方案。 对于使用 Flutter Web 和 AWS API-gateway 的 Future 查看者。

    如果你遇到这个问题,这意味着它来自后端而不是来自 Flutter 端 XMLHttpRequest 错误。是由 CORS 引起的

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

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

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 也会发送类似的标头,这对我来说是个问题

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"] = "sahaj@rootsapp.in";
    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());
    );
  

【讨论】:

以上是关于使用http postflutter web时出现XMLHttpRequest错误的主要内容,如果未能解决你的问题,请参考以下文章

ipad登陆网络时出现与安全web代理服务器(HTTP)通讯时出现问题怎么办

将 httpLogging 设置添加到 MVC web.config 时出现 HTTP 错误 500

调用 Web API 2 端点时出现 HTTP 415 不支持的媒体类型错误

将 ASP.NET 应用程序部署到 Azure Web 应用程序时出现 HTTP 403 错误

在 VS Code 上使用 Chrome Web 时出现“XMLHttpRequest”错误

尝试从 Web 应用程序获取数据时出现 Cors 错误(没有“访问控制允许来源”/它没有 HTTP ok 状态。)