【问题标题】:Can't get JSONP to work with javascript from external file?无法让 JSONP 与外部文件中的 javascript 一起使用?
【发布时间】:2018-07-16 17:51:05
【问题描述】:

我正在尝试使用 JSONP 和标准 javascript 从不同服务器上的外部文件访问一些 JSON 数据,但我无法让它工作。这是我正在使用的脚本,它位于与 json 文件不同的服务器上的 HTML 页面中。有人可以帮忙吗?

<script>

  function jsonCallback(data){
      console.dir(data);
  };

  var script = document.createElement('script');
  script.src = 'http://run.plnkr.co/plunks/v8xyYN64V4nqCshgjKms/data-2.json';
  document.getElementsByTagName('head')[0].appendChild(script);

</script>

【问题讨论】:

  • jsbin.com/yinowetugi/1/edit?html,js,output — 当我测试它时它可以工作。 (投票结束:问题必须包含足够的信息来重现问题)。
  • 谢谢昆汀。是的,它确实在 jsbin 中工作。我想知道这是否与我的服务器有关。你知道我如何访问 json 文件的各个数据,例如 siteName、Domain 等吗?
  • 你遇到了什么错误?

标签: javascript json jsonp


【解决方案1】:

编辑
我有一个误解,我认为问题上的 URL 是由提问者拥有的服务器托管的。让我谈谈我对他遇到的问题的看法。所以它在某些环境中有效,而在其他环境中无效。我试图重现该问题,但得到“参考:未定义 jsonCallback。”

我的测试环境使用 Webpack 从我的主脚本中制作一个包。那个包正在以 IIFE 的方式模块化我的主脚本。所以函数 jsonCallback() 被隐藏在全局范围之外,这就是我得到参考问题的原因。此外,当我在使用 iframe(分离范围)的 jsfiddle 中对其进行测试时,我遇到了同样的问题。所以要明确一点,我把主脚本直接放在了我的index.html中,没有经过任何编译过程,运行良好,jsonCallback()按预期调用了。

正如下面提到的 cmets 之一,我们没有足够的信息来解决它。但我留下了这些信息,希望它能帮助提问者。


JSONP 是一种非常方便的资源分配方式,可避免 CORS 策略问题。但是,它没有在许多服务器框架中默认配置。

我在使用 Laravel 4.2 时遇到了同样的问题。让我分享一下我在 Laravel 应用程序上所做的工作,以便您了解如何修复服务器。

return Response::json('$response_body'); // Wrong
return Response::json('$response_body')->setCallback(Input::get('callback')); // Good

另外,如果您还有其他问题,最好让我们知道您正在为您的服务器使用哪个框架。谢谢。

【讨论】:

  • 问题中有一个网址。它返回 JSONP。问题不在于服务器。如果您阅读了有关该问题的 cmets,您会看到 OP 已经承认没有问题。
  • @Quentin 你在哪里测试的?如果您在 Postman 上对其进行了测试,并假设它工作正常。你完全错了。在浏览器上测试,会看到JSON解析错误。
  • "你在哪里测试的?" — 我在对问题的评论中链接到了现场演示!
  • "在浏览器上测试,你会看到 JSON 解析错误" — JSONP 不是 JSON!如果您尝试将其解析为 JSON,它将无法正常工作。
  • JSONP 是一个包含 javascript 回调函数的字符串。它将被解析为 javascript 并被调用。通常是“jsonpCallback({...jsonObj})”。哥们,轻点。这与我上次遇到的问题完全相同。服务器框架默认不支持 JSONP。如果他想允许 JSONP 请求到他的服务器,那么他需要在服务器端允许它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2011-02-28
  • 2020-01-06
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多