我正在使用TinCan API,它将非json对象作为JSON请求发送。
所述请求中的请求有效负载的示例:
AWSAccessKeyId=secret
&Authorization=secret
&activityId=61XkSYC1ht2%5Fcourse%5Fid
&Expires=1395864543
&Content%2DType=application%2Fjson
&actor=null
®istration=760e3480%2Dba55%2D4991%2D94b0%2D01820dbd23a2
&stateId=resume
&Signature=ZNYa7WTtO5rWx%2FAs%2FuFxTQkiYdc%3D
Their documentation explains以一种释义的形式"数据按照XAPI规范第7.8节“跨原始请求”中所述发送,其中所有标题和内容都作为表单参数包含在内。 "
您可以从上例中的Content
键中看到这一点。该密钥及其子代可以解码并解析为JSON。
但由于初始请求为application/json
,我的应用会遇到JSON解析错误。
话虽如此,有没有办法设置服务器,或者我的控制器接受这些CORS请求,以便我可以正确地解析它们并使用它们的信息?
答案 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
标题。