如何解析这个JSON块?

时间:2014-03-26 19:30:31

标签: ruby-on-rails json cors tin-can-api articulate-storyline

我正在使用TinCan API,它将非json对象作为JSON请求发送。

所述请求中的请求有效负载的示例:

AWSAccessKeyId=secret
&Authorization=secret
&activityId=61XkSYC1ht2%5Fcourse%5Fid
&Expires=1395864543
&Content%2DType=application%2Fjson
&actor=null
&registration=760e3480%2Dba55%2D4991%2D94b0%2D01820dbd23a2
&stateId=resume
&Signature=ZNYa7WTtO5rWx%2FAs%2FuFxTQkiYdc%3D

Their documentation explains以一种释义的形式"数据按照XAPI规范第7.8节“跨原始请求”中所述发送,其中所有标题和内容都作为表单参数包含在内。 "

您可以从上例中的Content键中看到这一点。该密钥及其子代可以解码并解析为JSON。

但由于初始请求为application/json,我的应用会遇到JSON解析错误。

话虽如此,有没有办法设置服务器,或者我的控制器接受这些CORS请求,以便我可以正确地解析它们并使用它们的信息?

1 个答案:

答案 0 :(得分:1)

如果你碰壁并且无法改变完全破碎的客户,你可能想尝试在这里优雅地恢复。

通常,您可以在应用程序的config.ru文件中添加一个过滤器,该过滤器将重写损坏的标题:

use TinCanFixer

然后你写了Rack handler

class TinCanFixer
  def initialize(app)
    @app = app
  end

  def call(env)
    case (env["CONTENT_TYPE"])
    when "application/json"
      # Check that it's actually JSON
      unless (env["rack.input"].match(/^\{\[/))
        env["CONTENT_TYPE"] = "application/x-www-form-urlencoded"
      end
    end

    @app.call(env)
  end
end

未经测试但原则上应该嗅出非JSON内容并重新分配指示内容类型的rack.input标题。