Javascript axios、阵列参数和CORS

Javascript axios、阵列参数和CORS,javascript,cors,axios,Javascript,Cors,Axios,我在用axios和quasar/vue。 axios.post(this.serverUrl,null,{params:{blah:“test”}} 参数是第三个参数。我看到它应该是第二个,但当它是时,我得到了以下信息: CORS策略已阻止从源“”访问“”处的XMLHttpRequest:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”标头 当它是第三个参数时,一切都很好 在我需要传递JSON数组之前,一切都很好,例如: var info=[{name:“test”,年

我在用axios和quasar/vue。
axios.post(this.serverUrl,null,{params:{blah:“test”}}
参数是第三个参数。我看到它应该是第二个,但当它是时,我得到了以下信息:

CORS策略已阻止从源“”访问“”处的XMLHttpRequest:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”标头

当它是第三个参数时,一切都很好

在我需要传递JSON数组之前,一切都很好,例如:
var info=[{name:“test”,年龄:40},{name:“tester”,年龄:50}]
无论我尝试了什么,包括使用qs:
axios.post(this.serverUrl,null,{params:{dataToSend:info},paramsSerializer:params=>{return qs.stringify(params)}
和其他解析方法

parseParams(params) {
      const keys = Object.keys(params);
      let options = '';
      keys.forEach((key) => {
        const isParamTypeObject = typeof params[key] === 'object';
        const isParamTypeArray = isParamTypeObject && (params[key].length >= 0);
        if (!isParamTypeObject) {
          options += `${key}=${params[key]}&`;
        }
        if (isParamTypeObject && isParamTypeArray) {      
          params[key].forEach((element) => {
            options += `${key}=${element}&`;
          });
        }      
      });
      return options ? options.slice(0, -1) : options;
    },
我开始收到CORS的上述错误

我的猜测是解析是错误的,但即使在阅读了web上的这么多示例之后,我也不知道如何克服这个问题。我的服务器希望收到一个JSON数组,如上面的
[{name:“test”,age:40},{name:“tester”,age:50}]
,所以我需要客户端发送它。我使用的是axios 0.19.1

我错过了什么?谢谢

更新:

"/api": {
    target: "https://myrealdomain.com:8443",
    changeOrigin: true,          
    pathRewrite: {
        "^/api": "/mysuffix1/mysuffix2"
    }
}
调用
axios.post(“api”,{…})
是可行的,但在现实生活中,文件将与服务器位于同一位置,我不需要api后缀,只需要mysuffix 1/mysuffix 2


我可以在dev中将changeOrigin模拟为prod吗?

您必须在API/Web服务中启用CORS。有关答案,请参阅此问题:


您必须在API/Web服务中启用CORS。有关答案,请参阅此问题:


如果您计划最终将您的Quasar应用程序部署在与调用的API相同的域名上,您可以通过配置代理规则避免在
localhost:8080
上开发时在此API服务器上需要CORS规则。当您在开发模式下使用

$quasar-dev

它启动。此服务器可通过
quasar.config.js
进行配置。开发服务器包括一个代理API,可通过从应用程序调用
localhost:8080
调用该代理API,然后将其转发到
example.com
,通过以下设置更改API请求中的域名:
changeOrigin:true
。现在,位于
example.com
的API服务器可以看到来自同一原始域的请求,因此不需要CORS规则

devServer: {
  // https: true,
  port: 8080,
  open: true, // opens browser window automatically
 // set up one or more proxy rules
  proxy: {
    // Proxy requests prefixed by /api URL
    "/api": {
      target: "https://example.com",
      changeOrigin: true,  // Avoids the need for CORS rule on your API server
      // Optionally map /api to the same or a different path on the API server
      pathRewrite: {
        "^/api": "api"
      }
    }
  }
},
有关更多信息,请参阅


如果您计划最终将您的Quasar应用程序部署在与调用的API相同的域名上,您可以通过配置代理规则避免在
localhost:8080
上开发时在此API服务器上需要CORS规则。当您在开发模式下使用

$quasar-dev

它启动。此服务器可通过
quasar.config.js
进行配置。开发服务器包括一个代理API,可通过从应用程序调用
localhost:8080
调用该代理API,然后将其转发到
example.com
,通过以下设置更改API请求中的域名:
changeOrigin:true
。现在,位于
example.com
的API服务器可以看到来自同一原始域的请求,因此不需要CORS规则

devServer: {
  // https: true,
  port: 8080,
  open: true, // opens browser window automatically
 // set up one or more proxy rules
  proxy: {
    // Proxy requests prefixed by /api URL
    "/api": {
      target: "https://example.com",
      changeOrigin: true,  // Avoids the need for CORS rule on your API server
      // Optionally map /api to the same or a different path on the API server
      pathRewrite: {
        "^/api": "api"
      }
    }
  }
},
有关更多信息,请参阅


那么,为什么我的所有其他请求都顺利进行而没有出现问题呢?我仍然认为这是与解析相关的原因造成的。话虽如此:CORS只是为了本地主机可以通信?我这样问是因为本地主机只是为了测试。您的问题是
访问XMLHttpRequest at'https://example.com“
。你确认了吗确定它将发送到预期的服务器?example.com是真实域名的占位符。那么为什么我的所有其他请求都顺利进行而没有问题呢?我仍然认为这是与解析相关的原因造成的。我说过:CORS只是为了让localhost可以通信?我这样问是因为localhost只是为了测试您的问题n表示在'https://example.com“。您是否验证了它将被发送到预期的服务器?example.com是实际域名的占位符。最终它将与服务本身安装在同一台服务器上。现在,它将在测试阶段调用该服务器/服务。changeOrigin仅用于类星体发展"模式?我问是因为其他请求可以工作,只有这一个不行,这就是为什么我认为问题在于数组的解析。是的……代理规则只适用于
quasar dev
模式。我确信您已经检查了网络请求/响应值。在Chrome调试器中检查网络请求/响应中的JSON编码。检查头(尝试使用邮递员或女邮递员发送相同的邮件;)。看看是否可以找出原因。。可能是代理导致了一些问题或您的API服务器。如果启用了CORS规则,则可能需要允许特定的头。我将在回到计算机后进行更彻底的检查。昨天我进行了检查,参数为,例如:&data=&data=etc。我的服务器是否将接收为json array?如果会的话,我会很惊讶。Anwyay,今天晚些时候我会在这里发布一个更改代理后的请求示例。devServer:{https:true,//如果设置为false,页面将加载,如果设置为true,页面将不加载,端口:8080,打开:true,代理:{”/:{target:“,changeOrigin:true,//避免在API服务器上使用CORS规则路径重写:{“^/”:“}}}}我仍然收到相同的CROSJ错误,必须确保:客户端在localhost:8080上运行,并且正在调用myrealdomain.com:8443/API/