2014-03-26 51 views
0

我正在使用TinCan API作爲JSON請求發送非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

爲什麼他們會發送標記爲'application/json'的非JSON內容?你能修復破壞的實現嗎?最糟糕的情況:機架處理程序識別這些格式錯誤的請求,並在將內容類型標頭傳遞給Rails之前相應地旋轉內容類型標頭。 – tadman

+0

最壞的情況看起來像唯一的情況。任何建議朝着那個方向去做我該怎麼做? – Trip

回答

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

+0

看起來好像我的通話在我能夠在機架中捕獲通話之前就被取消了。這是否與我初始化初始化器中的TinCanFixer而不是我的config.ru實例有關? – Trip

+1

好吧。我這樣做'Rails.application.config.middleware.insert_before Rack :: Lock,TinCanFixer' – Trip

+0

我注意到調用覆蓋任何東西都不起作用..例如在你的例子中,當調用通過時,我看到它實際上並沒有改變請求的'CONTENT_TYPE' – Trip