Access-Control-Allow-Origin错误解决方法 - 无法访问服务器

时间:2017-06-13 20:02:27

标签: javascript jquery ajax xmlhttprequest cors

我使用AJAX在UPS上调用API

时出现以下错误
  

XMLHttpRequest无法加载https://wwwcie.ups.com/rest/Ship。回应       预检请求未通过访问控制检查:否'访问控制 - 允许 -       原产地'标头出现在请求的资源上。起源       ' http://localhost:63786'因此不允许访问。

AJAX致电:

$.ajax({
     url: "https://wwwcie.ups.com/rest/Ship",
     type: "POST",
     dataType: 'json',
     crossDomain: true,
     contentType: 'application/json',
     data: JSON.stringify(message),
     success: function (result) {
              //code to execute on success
     }
     error: function (result) {
              //code to execute on error
     }
})

我无法控制API服务器,所以我无法修改发回的标头。我尝试过JSONP,更改我发送的标题,以及其他一些解决方案无济于事。我已经读过,制作服务器端代理可能是合适的,但我不确定如何解决这个问题。任何有关可能解决方案的建议/代码示例都将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:-1)

什么是阻止恶意网站向您银行的网络应用发送请求并转移所有资金?要防止这些类型的恶作剧,如果您使用的是Web浏览器,则服务器必须明确说明允许哪些远程源访问某个资源(如果有)。

如果您需要密钥来访问它,则可能未启用CORS。您始终可以通过查看响应标头进行双重检查。见:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

正如其他人已经提到的那样,您可以通过从您自己的服务器发出请求来解决这个问题(标题不会将其标识为浏览器并受到CORS限制),并将其代理到您的客户端应用程序

假设你正在使用Node / Express,这样的东西应该可以工作:

const express = require('express');
const app = express();

const myHeaders = new Headers();

const myInit = { method: 'GET',
               headers: myHeaders,
               mode: 'cors',
               cache: 'default' };

app.get('/ups/stuff/stuff', (req, res) => {
  fetch('/ups/api/stuff', myInit)
    .then(response => response.json())
    .then(json => res.json(json);
});

app.listen(3000);

本机提取API很简洁,因为您可以在客户端和服务器上使用它,并且它支持像jQuery这样的promise。

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch