如何使用 Axios 从 localhost VueJS 调用服务器?

Posted

技术标签:

【中文标题】如何使用 Axios 从 localhost VueJS 调用服务器?【英文标题】:How to call a server from localhost VueJS with Axios? 【发布时间】:2021-06-04 18:57:59 【问题描述】:

我正在尝试从我的 VueJS 应用程序调用 AWS 托管 API,该应用程序在我的 localhost:8080 上运行。我用this blog post 来设置vue.config.js 这个块:

module.exports = 
    devServer: 
        proxy: 'https://0123456789.execute-api.eu-west-1.amazonaws.com/'
    ,
    ...

有了这个,我可以使用此代码向该主机上的端点发出GET 请求:

  this.$axios
    .get('https://0123456789.execute-api.eu-west-1.amazonaws.com/mock/api/endpoint',
    
      headers: 
        'Content-Type': 'application/json'
    )

这是因为我已将 AWS API Gateway 模拟端点配置为为 OPTIONS 方法返回这些标头:

Access-Control-Allow-Headers: 'Cache-Control,Expires,Pragma,Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'   
Access-Control-Allow-Methods: 'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'  
Access-Control-Allow-Origin: '*'

但是,我无法拨打此电话:

  this.$axios
    .get('https://0123456789.execute-api.eu-west-1.amazonaws.com/lambda/api/function',
    
      headers: 
        'Content-Type': 'application/json'
    )

此端点是一个 Lambda 集成,还有一个 OPTIONS 方法,其标头与上述相同。

为什么配置相同的两个端点对 axios 有不同的响应?

更新

按照@deniz 的建议,我已更新.env.development 文件以包含:

VUE_APP_API_URI=https://0123456789.execute-api.eu-west-1.amazonaws.com/

我还将axios 请求更新为:

let url = 'mock/api/endpoint'
let headers = 
  headers: 
    'Content-Type': 'application/json',
  ,


this.$axios
  .get(url, headers)

...和...

let url = 'lambda/api/function'
let headers = 
  headers: 
    'Content-Type': 'application/json',
  ,


this.$axios
  .get(url, headers)

第一个GET 请求得到的结果是:

200 OK

但是第二个请求的响应是:

Access to XMLHttpRequest at 'https://0123456789.execute-api.eu-west-1.amazonaws.com/lambda/api/function' from origin 'http://localhost:8080' 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.

【问题讨论】:

【参考方案1】:

您的开发环境配置。由于代理设置什么都不做,然后假装是其他人。 这就是为什么您在使用代理时不会遇到任何 CORS 问题。它有点像“我是别人,而不是本地主机”的瓶颈

module.exports = 
    devServer: 
        proxy: 'https://0123456789.execute-api.eu-west-1.amazonaws.com/'
    ,
    ...

从现在开始,您的所有请求都来自这个基于代理的 URL

https://0123456789.execute-api.eu-west-1.amazonaws.com/

如果您尝试像这样访问 api:

this.$axios
    .get('https://0123456789.execute-api.eu-west-1.amazonaws.com/lambda/api/function',
    
      headers: 
        'Content-Type': 'application/json'
    )

您应该记住,您已经假装您的代理正在做他的伪装,并且仍然像其他来源一样行事。

如果我没有完全错误,您调用 API 时的 URL 现在看起来像这样:

https://0123456789.execute-api.eu-west-1.amazonaws.com/https://0123456789.execute-api.eu-west-1.amazonaws.com/lambda/api/function

您只需将请求中的 axios url 更改为:

this.$axios
    .get('lambda/api/function',
    
      headers: 
        'Content-Type': 'application/json'
    )

然后再试一次。


更新

VUE_APP_API_URI=https://0123456789.execute-api.eu-west-1.amazonaws.com/

将您的 URL 字符串包含在引号中,像这样并删除最后一个斜杠。

VUE_APP_API_URI='https://0123456789.execute-api.eu-west-1.amazonaws.com'

这是处理 .env 变量的常见做法。

2。 您得到的 CORS 错误是不再使用代理的结果。 您现在从其他来源请求数据,这在 FireFox 或 Chrome 等现代浏览器上是不允许的。

在这里,您必须在 API 中处理服务器端配置: https://0123456789.execute-api.eu-west-1.amazonaws.com

因为如果您这样做,如果请求来自不同的来源,您需要授予本地主机和后端处理请求的权限,例如您的情况:

我是localhost,我向https://0123456789.execute-api.eu-west-1.amazonaws.com请求数据

通常这是被禁止的,并且对安全性有很高的风险

但解决方案是... 正如您之前在 AWS API 中所做的那样 Access-Control-Allow-Origin: '*' 是处理“CORS”问题的重要部分。

确保设置正确并按预期工作。也许玩弄它并设置localhost而不是*(允许所有人)

3。 我强烈建议您在开发中使用代理方式,仅在生产中使用非代理方式,并且只允许 CORS 用于您的前端。

【讨论】:

以上是关于如何使用 Axios 从 localhost VueJS 调用服务器?的主要内容,如果未能解决你的问题,请参考以下文章

从 axios 请求 url 中删除 localhost:8080

如何使用 axios 的代理

React js Cors policy 与 axios api 的问题在 localhost 如何解决?

用 PHP Rest API 反应 axios,如何编写 baseurl [重复]

React.js - 如何使用 axios POST 方法将数据从 div 传递到函数?

如何将响应数据包含到 axios 响应中?