【问题标题】:jQuery AJAX call to fetch web api data returns syntax errorjQuery AJAX 调用来获取 web api 数据返回语法错误
【发布时间】:2018-04-28 08:31:11
【问题描述】:

我正在尝试从此 url 获取此 对象:

https://test3.diavgeia.gov.gr/luminapi/opendata/dictionaries//KANONISTIKI_PRAXI_TYPE.json

您可能不会得到太多,因为它是希腊语,但您会得到 format。

这是我的代码:

function getDicts() {
  api_url = 'https://test3.diavgeia.gov.gr/luminapi/opendata/dictionaries/KANONISTIKI_PRAXI_TYPE.json'
  $.ajax({
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
    url: api_url,
    type: "GET",
    crossDomain: true,
    dataType: 'jsonp',
    success: function(api_data) {
      var obj = $.parseJSON(api_data);
      console.log(obj);
    },
    error: function(error) {
      console.log(error);
    },

  });
};
};
getDicts();

如果我使用as thedataType`,我会收到错误消息: SyntaxError:JSON.parse: 数据的第 1 行第 1 列出现意外字符

这是我的电话截图:

这是一个小提琴:https://jsfiddle.net/danee/sz7tLru8/

更新!

根据我找到的一些示例,我稍微更改了函数。使用dataType,在网络选项卡上我确实得到了一个 对象,但在控制台上我得到了这个: 语法错误:缺失;声明前[了解更多] KANONISTIKI_PRAXI_TYPE.json:1:7

这是与jsonp 通话的屏幕截图。 这似乎是 对象的错误?以前没遇到过。

我也更新了小提琴,但我什么也没得到,没有响应。

【问题讨论】:

  • 此 URL 具有完美的 JSON 响应,但是,由于 URL 具有跨域限制,我无法重现此错误。你能创建一个小提琴来重现它吗?
  • @31piy 感谢您的帮助。我更新了我的问题!
  • 小提琴没有帮助。我可以在控制台中看到相同的 CORS 错误。你试过运行它吗?
  • @31piy 是的,我做到了,而且效果很好。不过,我在小提琴上没有收到错误
  • 如上所述,我认为您不会遇到解析错误,而是 CORS。向您的 Ajax 添加错误函数,您将看到错误。我已经在本地部署了自己的 web api 来防止 CORS,返回相同的 json 并且工作正常,它运行状态为 0 的成功函数。查看“网络”选项卡会误导你。

标签: json json json json jsonp json json javascript jquery json ajax


【解决方案1】:

您的互联网浏览器正在阻止 CORS Ajax 调用。作为一种解决方法,一种选择是部署您自己的 Web 应用程序,仅用于运行 Web 请求以针对 diavgeia.gov.gr 外部 Web api 而没有此限制。

Internet 浏览器 -(Ajax) -> 您的网络服务器 -> 目标网站

另一种选择是使用已经免费提供此服务的反向代理网站。他们将从服务器而不是 Internet 浏览器为您调用外部 Web api,这样就可以避免 CORS。

Internet 浏览器 -(Ajax) -> 反向代理 -> 目标网站

let anonimizerUrl = 'https://allorigins.us';
var apiUrl = 'https://test3.diavgeia.gov.gr/luminapi/opendata/dictionaries/KANONISTIKI_PRAXI_TYPE.json';
$.ajax({
  url: anonimizerUrl + '/get?url=' + encodeURIComponent(apiUrl),
  success: function(response) {
    //Although response is an object, the field contents is a string and needs to be parsed here.
    var data = JSON.parse(response.contents); 
    console.log(data);
  },
  error: function(request) {
    console.log(request.responseText);
  }
});

如果 Allorigins 被您的互联网提供商 (ISP) 阻止,请尝试使用来自 this list 的其他类似服务器,包括。

注意:根据您的帖子,我假设您无权更改网络 API。否则,可以从那里启用 CORS 或进行更改以返回 jsonp 而不是 json。

【讨论】:

  • 这很有帮助!不,我无权更改 Web api。感谢您的帮助!
猜你喜欢
  • 2013-10-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
相关资源
最近更新 更多