【问题标题】:JSONP script returning MIME Type errorJSONP 脚本返回 MIME 类型错误
【发布时间】:2018-01-03 00:59:26
【问题描述】:

您好,我目前正在编写一个脚本,该脚本必须从返回 json 文件的第三方提要中提取信息。我无法使用 CORS,因为我没有服务器访问权限,因此根据案头研究,我被告知使用 JSONP。我可以在 chrome 网络的选项卡中看到回调(响应),但我无法读取 chrome 日志中的文件。关键是当我执行以下代码时,我会收到下面的错误消息。我无法关闭 mime 类型检查。我试图看看其他问题,但找不到类似的东西。 应该怎么做?

“拒绝执行来自'https://siteurl.com/json=jsonp&callback=jQuery321030035432758818903_1501098778362&_=1501098778363'的脚本,因为它的MIME类型('application/json')不可执行,并且启用了严格的MIME类型检查。”

<script src="jquery.js"></script>
<script>
        $.ajax({
            type: 'GET',
            url: 'siteurl.com/json?callback=jsonp',
            dataType: 'jsonp',
            xhrFields: {
                withCredentials: false
            },
            headers: {
                "Accept" : "application/json; charset=utf-8",
                "Content-Type": "application/javascript; charset=utf-8",
                "Access-Control-Allow-Origin" : "*"
            },
            success: function (result) {
                console.log(result);
            },
            error: function (xhr, errorText) {
                console.log('Error ' + xhr.responseText);
            }
        }); 
</script>

看看网络标签:

Network tab view

【问题讨论】:

  • 你确定服务器支持jsonp响应吗?当您在网络选项卡中预览响应时,实际 json 之前是否有 jQuery321030035432758818903_1501098778362(
  • "Content-Type": "application/javascript; charset=utf-8" — 这毫无意义。您正在发出 GET 请求。没有描述内容类型的请求正文。
  • "Access-Control-Allow-Origin" : "*" — 这毫无意义。 Access-Control-Allow-Origin 是 response 标头,而不是请求标头。
  • @yuriy636 是的,请查看我刚刚包含的问题末尾的链接。
  • @Colpachi 不是 JSONP,服务器正在响应 JSON,这就是 MIME 不匹配的原因。

标签: javascript json ajax


【解决方案1】:

JSONP 不是 JSON! JSONP 是一个 JavaScript 程序,由一个带有一个参数的函数调用组成。

正确的 Content-Type 是 application/javascript


我无法使用 CORS,因为我没有服务器访问权限,因此根据案头研究,我被告知使用 JSONP。

如果网站提供 JSONP,您只能使用 JSONP。 (现在他们应该改用 CORS,它在各方面都更好)。只是在查询字符串中添加callback 不会神奇地强制网站提供 JSONP 并为您破坏同源策略。该站点必须明确地将数据公开给其他站点。

【讨论】:

  • @Ashraf.Shk786 — 这就是这个答案的第 2 行所说的。
  • 我无法理解的是为什么服务器会发送带有 JSON 文件的回调?该文件已经在browser中,只需在控制台中读取即可。
  • @Colpachi — “我不明白为什么服务器会发送带有 JSON 文件的回调?” — 是吗?您没有显示响应或提供有效的 URL。可能它只是一个错误,在这种情况下,问题仍然需要在服务器上修复。
  • @Colpachi —“文件已经在browser中,只需在控制台中读取即可。” — 请参阅stackoverflow.com/a/35553666/19068,特别是“为什么同源策略仅适用于网页中的 JavaScript”部分
  • @Colpachi — 这不是 JSONP 响应。那是JSON。请参阅此答案的最后一段。
【解决方案2】:

这是 Content-Type 的问题。

Content-Typeapplication/json 对于 JSON 是正确的,但对于 JSONP 是不正确的。

Content-Typeapplication/javascript 用于 JSONP。

请检查:What is the correct JSON content type?

【讨论】:

  • 恐怕不是因为当我更改为 application/javascript 时,错误消息是相同的:“Refused to execute script from 'siteurl.com/…' because its MIME type ('application/json' ) 不可执行,并且启用了严格的 MIME 类型检查。"
猜你喜欢
  • 2011-05-12
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 2011-10-11
  • 2014-06-27
相关资源
最近更新 更多