【问题标题】:javascript: MIME type ('text/html') is not executable, and strict MIME type checking is enabledjavascript: MIME 类型 ('text/html') 不可执行,并且启用了严格的 MIME 类型检查
【发布时间】:2016-08-01 19:00:53
【问题描述】:

我正在尝试向 Spotify Api 发出简单的获取授权请求。如果我发出一个 GET HTTPRequest,那么我会收到一个跨域错误。因此,我使用回调发出 JSONP 请求,但这会导致 MIME 类型错误,如上所示,我发现其解决方法是再次发出 HTTPRequest JSON 请求以匹配 MIME 类型。我在这里陷入了僵局!请帮忙!谢谢

这是我的 js 代码块:

(function(){
    var script = document.createElement('script');
    script.src = 'https://accounts.spotify.com/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=https://samcasm.github.io/moodsetNow/moodset.html&scope=user-read-private%20user-read-email&state=34fFs29kd09?callback=mySpotify';
    document.getElementsByTagName('body')[0].appendChild(script);
})();

function mySpotify(){
console.log(response);
}

【问题讨论】:

  • @J F 你去@JF
  • @J F 没错,我正在尝试加载授权 html 文件作为来自 Api 的响应。该请求在 POSTMAN 上运行良好

标签: javascript ajax api spotify


【解决方案1】:

您的问题似乎是您正在使用 <script> 标记来加载 HTML 页面。这是我建议的解决方案:

  1. 当用户需要认证时,重定向他们:

    location.href = "https://accounts.spotify.com/authorize" + 
        "?client_id=" + CLIENT_ID +
        "&response_type=token" + 
        "&redirect_uri=" + encodeURIComponent(THE_URI_TO_REDIRECT_TO) + 
        "&state=" + STATE + // optional
        "&scope=" + SCOPES.join(" ") + // optional
        "";
    

    请注意,如果您要在页面加载时重定向,请使用 location.replace(...) 而不是 location.href = ...。这样,用户的后退按钮历史记录中就不会出现立即重定向页面。

  2. 然后,在THE_URI_TO_REDIRECT_TO 中的 URL 处,解析哈希:
    Spotify 会生成这样的哈希:#access_token=...&expiry=...location.hash 返回该哈希,包括前导 #。首先,我们设置将保存选项的对象:

    var hash = {};
    

    然后,我们删除#:

    var h = location.hash.slice(1)
    

    …然后在&s 上拆分。

    h = h.split('&')
    

    接下来,我们遍历所有对 (forEach) 并将这两部分放入 hash 对象中(即hash['access_token'] = '...';

    h.forEach(function(pair) {
        pair = pair.split('=');
        hash[pair.shift()] = pair.join('=');
    });
    
  3. 之后,就可以读取数据了。

    if (hash.error) {
        console.log(hash.error);
    } else {
        var token = hash.access_token;
        hash.token_type === "Bearer";
        var expiry = new Date();
        expiry.setSeconds(expiry.getSeconds() + (+hash.expires_in));
    }
    var state = hash.state; // optional
    

【讨论】:

  • @J F 感激不尽!只有一件事,你能告诉我你在回调脚本中做了什么(第 2 点),或者给我指出一个方向,这样我就可以了解更多信息。我最近一直在使用 Apis,但还没有弄清楚重定向 uri 的工作原理或脚本的作用。再次感谢:D!
  • @J F 太棒了!这完全有道理!万分感谢 !干杯^_^
  • 嘿@JF 只是一件事,如果哈希函数(名为 myfunction() )嵌入在我的相同 index.html 的脚本标签中,该标签在 redirect_uri 中被调用,这是否会调用 @987654321 @调用它?
  • 没有。这只是 JSONP。但是,您可以在您检查的redirect_uri 中添加?login 或其他内容,然后调用myfunction()。不过,拥有单独的页面可能更容易。
猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 2018-08-20
  • 2018-09-11
  • 2017-10-02
  • 2018-09-30
  • 2018-09-20
  • 2021-06-20
  • 2020-08-27
相关资源
最近更新 更多