2015-12-04 17 views
1

我正在整合第三方API,並且一步到位地將JSON數據發佈到我們的服務器中。在軌道中執行特定路由的機架中間件

內容類型爲application/json,但有效負載實際上是經過了gzip壓縮。由於內容類型的原因,rails在嘗試解析數據時拋出了ActionDispatch :: ParamsParser :: ParseError異常。

我打算編寫一個機架中間件來捕捉異常並嘗試解壓縮有效負載,但我只想爲特定操作執行該操作,是否有辦法僅針對特定路由執行中間件?

更新

我已經想過模式匹配的路徑,但最好我想的東西,是一個小更穩健的情況下,路徑在未來改變。

更新

關於壓縮的問題最好通過以下亞光的評論上前,和路由是另外一個問題,這是現在被標記的重複回答。

+1

那豈不是更好地檢查請求的「內容編碼」標頭,並基於此處理壓縮? (假設第三方包括那個頭文件,就去給它們一個(隱喻的)巴掌,如果它們不是的話)。 – matt

+0

可能經過進一步的調查後,這似乎是一個好方法,並且他們發送了「內容編碼」頭文件 – agbodike

+0

@matt我發現這個:https://gist.github.com/relistan/2109707,可以用你的建議的路線 – agbodike

回答

1

您可以輕鬆地在路徑上執行正則表達式匹配,並且只在路徑匹配時執行解壓縮代碼。在這種情況下,您不會跳過所有其他路由的中間件,但處理該檢查應該非常輕量。將此放在的lib /中間件/ custom_middleware.rb

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

    def call(env) 
    @req = Rack::Request.new(env) 

    if should_use_this? 
     # Your custom code goes here. 
    end 
    end 


    def should_use_this? 
    @req.path =~ /^matchable_path/ # Replace "matchable_path" with the path in question. 
    end 

end 

然後把你的配置/環境/ production.rb以下

config.middleware.use "CustomMiddleware" 
+0

這是我已經想過的可能性,但我想要更多一點它比路徑上的簡單模式匹配更穩健。 – agbodike