【问题标题】:cross domain ajax request of plain text file纯文本文件的跨域ajax请求
【发布时间】:2016-06-24 15:50:32
【问题描述】:

我正在努力解决一个看似简单的问题。 我有一个 json 数据,它作为纯文本文件存储在某个服务器上,我需要在 javascript 中加载它。我收到错误

XMLHttpRequest 无法加载 http://www.cgarea.com/ary_telemetry/messages.json。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://fiddle.jshell.net' 因此不允许访问。

我正在阅读有关 CORS 的信息并测试不同的解决方案,但没有成功。 如果目标 URL 是 PHP 脚本,我可以设置一个标头('Access-Control-Allow-Origin: *'),但它只是一个文本文件。 我怎样才能加载这个?我需要创建一个很小的 ​​PHP 脚本吗? 返回文件内容?

我在http://jsfiddle.net/rt6jj5tv/6/上放了一个最少的代码

感谢任何提示,谢谢。

JS代码:

function GetMessages()
{
    //$.getJSON("http://www.cgarea.com/messages.json", GetMessagesCB);      
  $.ajax({
            type: 'GET',
            url: "http://www.cgarea.com/messages.json",
            dataType: "text/plain",
            success: GetMessagesCB
            });
}

function GetMessagesCB(data)
{
    console.debug(data);
    var ui = document.getElementById("Message");
    ui.innerHTML = data;
}

GetMessages();

【问题讨论】:

    标签: javascript cors


    【解决方案1】:

    很抱歉,出于某种原因,我以为有 PHP。
    好吧,要完全回答您的问题,您需要在服务器端启用 CORS。除非您拥有:http://www.cgarea.com/ary_telemetry/messages.json,否则您只能联系该网站的所有者。

    【讨论】:

    • 嗨 wateriswet,我拥有 cgarea.com,它在托管帐户上。你知道如何/在哪里可以找到 PHP 这个配置吗?
    【解决方案2】:

    正如您所提到的,您需要运行 JSONP 或 CORS 代理才能通过 AJAX 从另一个域检索文本文件。这是浏览器内置的安全机制。

    您可以在自己的 PHP 脚本中添加标头来实现此目的。另一种可能的方法是use YQL

    代码:

    function GetMessages()
    {
      $.getJSON("http://query.yahooapis.com/v1/public/yql",
        {
          q:      "select * from json where url=\"http://www.cgarea.com/messages.json\"",
          format: "json"
        },
        function (data) {
          if (data.query.results) {
            GetMessagesCB(data.query.results.json);
          } else {
            alert('bad');
          }
        }
      );
    }
    
    function GetMessagesCB(data)
    {
        console.debug(data);
        var ui = document.getElementById("Message");
        ui.innerHTML = JSON.stringify(data);
    }
    
    GetMessages();
    

    您的小提琴已更新:http://jsfiddle.net/rt6jj5tv/7/

    【讨论】:

    • 谢谢斯蒂芬 这几乎可以工作。我正在获取我的数据,但由于某种原因,密钥已更改。相反,日期为 2016-03-09_15:58:18 我得到 _016-03-09_15:58:18。有什么线索吗?同样试图解决这个问题,我注意到对 JSON 文件的更改没有反映,就好像它被缓存在某个地方一样。谢谢
    • 对,我相信这两个问题都与 YQL 有关。 YQL 具有缓存以防止滥用其服务,并且它们还“智能”地解析 JSON 响应。尝试查看以下两个链接来解决这两个问题:yqlblog.net/blog/2010/03/12/…developer.yahoo.com/yql/guide/response.html#response-structure
    • 最后我只是通过 PHP 来提供服务。但至少我了解了YQL!谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多