【问题标题】:How to get data from cross-site? I'm using $.post如何从跨站点获取数据?我正在使用 $.post
【发布时间】:2012-02-02 04:31:08
【问题描述】:

我正在测试本地主机上的 javascript 代码。此文件需要来自远程服务器的 JSON 格式的数据。当我直接点击 JSON url 时,我得到了数据,但是在 javascript 中,我得到了空响应。

可能是什么原因?我正在使用 jquery post 方法来获取数据。

【问题讨论】:

    标签: javascript jquery ajax cross-site


    【解决方案1】:

    出于安全原因,您无法使用 JavaScript 访问来自不同域的任何资源。 jQuery 对此无能为力,但有一些方法可以实现这一点,例如 JSONPYQL

    看看这个使用YQL跨域AJAX请求的快速提示。

    http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-cross-domain-ajax-request-with-yql-and-jquery/

    【讨论】:

      【解决方案2】:

      $.post 是 ajax 方法,不能使用 ajax 方法访问不同来源的数据。

      详情请见the jQuery docs

      由于浏览器安全限制,大多数“Ajax”请求都受制于 同源政策;请求无法成功检索 来自不同域、子域或协议的数据。

      【讨论】:

        【解决方案3】:

        您应该研究一下使用 JavaScript 设置的保护措施。这是同源政策。基本上,这意味着如果您想对来自与您所在页面不同来源的服务器的数据执行 XmlHttpRequest,则不能,除非您跳过箍。

        查看 JSON-P 或 jQuery 的方法来克服这个问题。

        【讨论】:

          【解决方案4】:

          您请求的服务器必须支持JSONPCORS

          否则是不可能的。

          也不能使用POST发出JSONP请求,必须是GET

          【讨论】:

            【解决方案5】:

            出于安全考虑,从不同域请求数据受到限制(请参阅CORS),特别是为了防止 XSS(跨站脚本)攻击。

            您可以尝试几种替代方法:

            • JSONP 是一个选项,如果其他域支持它
            • here's另一个相关问题

            您可以使用YQL 从另一个域请求资源。

            除了这些替代方案之外,您始终可以创建服务器代理并让该代理查询域并返回结果。

            【讨论】:

              【解决方案6】:

              正如其他人所说,您不能使用 AJAX 访问远程服务器。您必须使用 JSONP。如果您无法控制其他服务器,或者其他服务器不提供 JSONP,则您必须使用代理。

              用 PHP 写一个真的很容易。 http://www.betavine.net/bvportal/blog/view.html?blogId=101&postId=ff8080811afe49d3011afe4bb5de0003

              <?
              ob_start();
              
              $url = $_REQUEST['url'];
              $curl_handle = curl_init($url);
              curl_setopt($curl_handle, CURLOPT_HEADER, 0);
              curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 1);
              curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
              curl_setopt($curl_handle, CURLOPT_USERAGENT, "Owen's AJAX Proxy");
              
              $content = curl_exec($curl_handle);
              $content_type = curl_getinfo($curl_handle, CURLINFO_CONTENT_TYPE);
              curl_close($curl_handle);
              header("Content-Type: $content_type");
              echo $content;
              ob_flush();
              ?>
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-09-06
                • 2014-04-16
                • 1970-01-01
                • 1970-01-01
                • 2017-06-12
                • 2015-09-29
                • 1970-01-01
                • 2021-12-01
                相关资源
                最近更新 更多