【问题标题】:Can't make get request using ajax无法使用 ajax 发出获取请求
【发布时间】:2011-08-31 05:28:47
【问题描述】:

这是错误信息: XMLHttpRequest 无法加载(url1)。 Access-Control-Allow-Origin 不允许来源http://localhost:8081

代码如下:

$.ajax({
    url: (the url2),
    async : false,
    data: { fbId     : eh,
            fbSecret : meh,
            key      : bleh
          },
    datatype: "json",
    success: function(result){
                 console.log(result);
             }
});

我知道网址是正确的,因为当我点击它时,它会为我提供我需要的数据,例如 {"names" : ["blah"]}

我需要提供更多细节吗?

我尝试了各种方法,例如使用 jsonp/html 代替 json,将数据直接放入 url 而不是单独作为数据,使用 $.get 代替 $.ajax,以及编辑 $.ajaxsetup... .

【问题讨论】:

  • 出于安全原因,不允许向其他域发送 AJAX 请求。谷歌应该告诉你这个......

标签: javascript ajax jquery


【解决方案1】:

错误信息说明了一切,由于same-origin-policy

,您无法发出跨域ajax请求(jsonp除外,但服务器也必须支持)

这可能会对你有所帮助http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-cross-domain-ajax-request-with-yql-and-jquery/

【讨论】:

  • 嗯,有什么办法可以覆盖这个吗?
  • :) 不,您不能覆盖它,但是您可以创建一个可以访问此服务的服务器端代理,然后您可以向您的服务器代理发出 ajax 请求,它将返回 json 响应
  • .. 或者您可以使用带填充的 json ;) 真的不知道“jsonp 的例外情况但服务器也必须支持”是什么意思..
  • @Walialu jsonp 是带填充的 json,但只有在服务器支持的情况下才能使用它
  • @3nigma 我不明白你的意思,我在几个不同的网络项目中使用了 jsonp 几次,我不需要为此设置或修改一些尴尬的 mod/config 文件。 . 你可以在这里看到它:imho.h4kr.com/30
【解决方案2】:

端口不匹配 ;) 尝试建立请求的页面必须在同一个端口上 ;)

【讨论】:

    【解决方案3】:

    我认为您正在尝试访问与您提供脚本的服务器不同的服务器 - 从服务器 A 提供的页面内的 JavaScript 代码只能使用 XmlHttpRequest 访问服务器 A。

    如果这是问题,则没有简单的解决方案 - 您必须使用代理或完全避免 XmlHttpRequest。

    【讨论】:

      【解决方案4】:

      same-origin-policy 是一种浏览器安全措施,可限制 JavaScript 代码与来自其他网站的资源(即从任何其他域和/或端口加载的资源)进行通信。例如。在http://google.com:80 上的网页中运行的JS 无法与从http://cbs.com 甚至http://cbs.com:8081 加载的数据进行交互

      解决 SOP a) 服务器中的代理:您在应用程序中创建一个与外部 url 对话并返回结果的端点

      b) 将 JSON 响应加载到 <script> 标记中,否则为 jsonp,即带填充的 json

      例如:

      var url = "http://localhost:8081/?queryString=asdsa&callback=jsonCallback";
      
      var script = document.createElement("script");
      script.setAttribute("src", url);
      script.setAttribute("type", "text/javascript");
      
      window.jsonCallback = function(jsonObj) {
        // use JSON object here
      
        // cleanup
        document.body.removeChild(script);
        delete window[callback];
      }
      
      document.body.appendChild(script)
      

      在您的情况下,由于您正在使用不同的端口运行它,因此它无效,因此浏览器抛出了错误..

      随之而来的是一些服务器端更改。阅读有关如何为您的脚本语言执行此操作的信息。

      基本上响应应该是这样的:

      jsonCallback({"Name": "Random", "Id" : 2432, "Rank": 453})
      

      【讨论】:

        【解决方案5】:

        使用dataType: "JSONP" 来克服您遇到的限制;查看documentation 以正确实施它。您还必须为其提供回调函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-20
          • 1970-01-01
          • 2014-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-09
          相关资源
          最近更新 更多