0

我尝试使用 JavaScript (JQuery) 与 JDoodle API Server 通信,但每次都说 CORS 错误。但是当我使用 Java Servlets 做同样的事情时,它完美地工作了。我使用了 axios,但它也显示“网络错误”。我的功能如下所示:

function x()
        {
            var dataJ = {
                clientId: ''XXXXXXXXX,
                clientSecret:'XXXXXXXXXX',
                language:'PHP',
                script:'',
                versionIndex: '0'
            };
            $.ajax({
                type:'POST',
                url:'https://api.jdoodle.com/v1/execute/',
                data: dataJ,
                success: function(e)
                {
                    console.log(e);
                },
                error: function(e)
                {
                    console.log(e.statusText);
                }
            });
        }
4

2 回答 2

0

它是一个不允许其他客户端使用站点功能的安全策略:

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

只有该站点的页面可以将消息发送到站点或该站点在自己的站点上处于活动状态 allow-access-allow-origin

于 2019-05-17T06:44:13.567 回答
0

CORS 由后端 API 控制,在您的情况下,您无法控制它,即 https://api.jdoodle.com/v1/execute/.

浏览器会阻止您的代码访问响应,因为浏览器看不到Access-Control-Allow-Origin响应。

通过代理发出请求,事情仍然可以正常工作,代理可以代表您的请求发送适当的 CORS 标头。

const proxy = "https://cors-anywhere.herokuapp.com/";
const url = "https://api.jdoodle.com/v1/execute/"; 
fetch(proxy + url)
  .then(response => response.text())
  .then(contents => console.log(contents))
  .catch(() => console.log("CORS Error" + url ))

对于您的情况

const proxy = "https://cors-anywhere.herokuapp.com/";
const url = "https://api.jdoodle.com/v1/execute/";

function x() {
  var dataJ = {
    clientId: "XXXXX",
    clientSecret: "XXXXXXXXXX",
    language: "PHP",
    script: "",
    versionIndex: "0"
  };
  $.ajax({
    type: "POST",
    url: proxy + url,
    data: dataJ,
    success: function(e) {
      console.log(e);
    },
    error: function(e) {
      console.log(e.statusText);
    }
  });
}

通过代理发出请求将以这种方式工作

  1. CORS 代理会将您的请求转发到https://api.jdoodle.com/v1/execute/
  2. https://api.jdoodle.com/v1/execute/带有标头的返回响应Access-Control-Allow-Origin
  3. 现在您的浏览器可以看到Access-Control-Allow-Origin响应标头中存在的标头。

有关更多详细说明,您可以查看此

https://stackoverflow.com/a/43881141/2850383

于 2019-05-17T06:51:21.237 回答