【问题标题】:Why Does JSONP Call Return Forbidden 403 Yet URL can be accessed in a browser为什么 JSONP 调用返回 Forbidden 403 却可以在浏览器中访问 URL
【发布时间】:2014-05-25 16:30:15
【问题描述】:

我知道有几个与此相关的问题 - 但我找不到我的答案。另外,我想进一步澄清一下。

我正在本地运行一个 Rails 应用程序,它对用作 API 的 sinatra 应用程序进行 jsonp 调用。

当我将此 URL 放入浏览器时,我最终得到了正确的响应,但是当我使用 $.getJSON 通过 jQuery 进行此调用时,我得到了一个禁止的 403 错误。我知道 $.getJSON 正在根据具有 callback=? 的 url 发出 jsonp 请求。参数。

我正在尝试找出导致 403 错误的原因。 api应用程序上是否有一些默认配置拒绝请求,因为脚本是从包含的脚本标签中请求的?

现在 api 请求返回 json 数据。我认为我有责任查看回调参数并构造一个实际调用回调的响应...

所以如果 url 是 http://myapi.com?callback=blah,那么我应该返回如下内容:

废话({foo: 'bar'})

但我不知道 403 到底是什么。如果返回的是 api 服务器,那么它试图防止什么?

以下是 jsonp 调用的示例:

$.getJSON( 'http://myapi.com?callback=?', {biz: 'buzz'})

我看到有关为跨源问题设置标头的帖子——但不确定为什么 jsonp 请求需要这样做。

【问题讨论】:

    标签: jsonp


    【解决方案1】:

    您需要为您的 sinatra api 应用程序添加 jsonp 支持。

    这是向您的 sinatra 应用程序添加 jsonp 支持的一种方法

    将rack-contrip gem 添加到您的 Gemfile 中

    gem 'rack-contrib'
    

    将以下内容添加到您的 config.ru

    require 'rack/contrib'
    use Rack::JSONP
    

    重新启动您的 sinatra 应用并开始从 javascript 测试 jsop

    【讨论】:

    • 我发现我们在 sinatra 中将 content_type 设置为 :json。这就是导致问题的原因。一旦我把它拿出来,页面就会作为 text/html 的内容类型返回,这就解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2017-05-15
    • 2012-09-02
    • 2014-03-13
    • 2023-02-18
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多