【问题标题】:Same Origin Policy Error when using jQuery JSONP with CloudFlare API将 jQuery JSONP 与 CloudFlare API 一起使用时出现同源策略错误
【发布时间】:2026-01-01 01:35:01
【问题描述】:

我在尝试通过 jQuery 向 CloudFlare 发送 JSONP 请求时收到错误 (XMLHttpRequest cannot load https:// www.cloudflare.com/api_json.html?tkn=&email=&z=&a=rec_load_all&callback=%3F. Origin http:// domainmanager.tech-bytes.org is not allowed by Access-Control-Allow-Origin.)(由于 Stack Overflow 链接限制,在 URL 中插入了空格)。 CloudFlare API 声明您可以通过附加&callback=mycallback 参数来请求 JSONP 回调。我不确定是否应该将 mycallback 替换为某些东西,我尝试将其替换为 ?因为那是其他一些资源所说的,或者如果我必须对my code 做一些其他修改。

【问题讨论】:

  • 控制台中有什么? 200 status.
  • 我不确定你的意思。我发布了上面控制台中的内容,除非您指的是不同的控制台?我还发布了我存储代码的地址,您也许可以在那里检索信息。
  • 我检查了你的 json api url 和 that is succeeding status comes with 200
  • 什么?我意识到两台服务器都成功返回了 HTTP 代码(200),但这不是我的问题。如果您无法重现该问题,请尝试在 Chrome 中检查控制台,因为并非所有浏览器都以相同的方式执行/实施同源策略,有些根本不使用它。

标签: api jquery getjson same-origin-policy


【解决方案1】:

尝试这种方式进行跨域请求。

  $.ajax({ url: "yourUrl",
    data:{paramName1: JSON.stringify(paramValue1),paramName2: JSON.stringify(paramValue2)},

        contentType: "application/json; charset=utf-8",
       dataType: "jsonp",
      success: function(data) {
          alert(data.d);
       },
       error: function(XMLHttpRequest, textStatus, errorThrown) {
           alert(textStatus);
       }
    });

【讨论】:

  • +1 for the dataType:"jsonp",但我认为您通常不需要 JSON.stringify 作为参数(除非它们是您希望序列化的对象),并且我相信错误回调不会为 jsonp 请求触发(最好添加处理程序,但如果未激活也不要感到惊讶)。
  • 有没有办法在仍然使用 .getJSON 速记方法的同时使用 JSONP,还是必须使用 .ajax 方法?我正在阅读API documentation 并看到他们有一个使用 .getJSON 从 Flickr JSONP API 检索数据的示例,但无法弄清楚如何将其应用于我的代码,或者它与常规 JSON 请求有何不同。
  • @NGWMark 在 .getJSON 中,我们没有将 Datatype 声明为 jsonp。并且始终尝试使用 .ajax 方法,这样您可以更好地控制您的请求。
  • @Iftah 你说得对,不需要 JSON.stringify() 方法。
【解决方案2】:

您可以为此目的使用 CORS。

示例代码:

jQuery.support.cors = true; 

function CrosDom_ajax(url) {
        if (window.XDomainRequest
        && $.browser.msie
        && $.browser.version < 10) {
        xdr = new XDomainRequest();
        if (xdr) {
            xdr.onload = function () {
               alert(xdr.responseText);

            };
            xdr.open("get", url);
            xdr.send();
        }
        }
        else {
            $.ajax({
                url: url,
                success: function (response) {


                },
                error: function (data) {
                }
            });
         }
    }

另外你需要在服务器端编写如下代码,以允许跨域访问

Response.AppendHeader("Access-Control-Allow-Origin", "*");           

【讨论】:

    最近更新 更多