注意:事实证明,这与flutter无关,而是与我将API网关设置为Lambda代理的事实有关
我试图从Flutter Web应用程序中命中APIendpoint,每次它都出错并给我以下错误。
获取传感器数据时出错:DioError[DioErrorType. RESPONSE]:XMLHttpRequest错误。
我知道在讨论这个问题的SO上有几个问题(像这样和这样),解决方案似乎是在服务器端启用CORS支持。我正在使用AWSAPI网关来构建API,我按照这些说明从API启用CORS支持。这是API网关控制台的CORS设置。
“访问-控制-允许-标头”中的文本是
'内容-类型, X-A mz-日期,授权,X-Api-密钥,X-A mz-安全-令牌'
在API网关上启用CORS似乎没有帮助,当我尝试API时,我仍然在Flutter Web应用程序上遇到同样的错误。
有趣的是,如果我从chromeAPI,API工作得很好(即在浏览器上粘贴APIURL并按回车键)。只有当我尝试从flutter网络应用程序中API时,它才会失败。
问题:如何在API网关中启用CORS支持,以便Flutter Web应用可以使用API?
这对我有用,我在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)
};
我的服务器正在使用nginx,所以我通过将以下两行添加到我的API服务器的启用站点的配置文件的服务器块来解决这个问题:
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, HEAD";
我的应用程序只使用GET
和HEAD
,因此您可能需要根据您的情况添加其他方法。
另请参阅:如何在Apache和Nginx中启用CORS?
我使用Nodejs作为我的后端。当我从Dio发送帖子请求时,出现了这个错误:“XMLHttpRequest error.”。
此错误背后的原因:假设您的flutter运行在localhost:3000的localhost:5500和nodejs服务器上。因此,您的浏览器无法处理请求,因为它们运行在不同的端口上。这就是我们使用CORS或代理来解决这些问题。
请记住,这是一个主要与您的浏览器相关的问题。如果您将使用postman并发送相同的请求,您将发现一切正常。
为了解决这个问题:我安装了一个名为CORS的NPM包。
npm i cors
然后,开始使用它……
const cors = require("cors");
app.use(cors());
只要这样做,你的错误就会得到解决。你不需要再添加任何东西。