2016-10-25 31 views
8

W przeszłości używałem this solution, ale od Rails 5 deprecatedParamsParser oprogramowanie pośrednie już nie działa.Jak akceptować żądania gzipped w aplikacji rails 5?

+0

czy to działa, jeśli włożysz je przed 'actio nDispatch :: Cookies'? Które jest oprogramowaniem pośredniczącym i nadal istnieje. –

+0

możesz zaimplementować rozwiązanie za pomocą nginx, aby przeprowadzić dekompresję https://www.nginx.com/resources/admin-guide/compression-and-decompression/ w ten sposób rails nie musi sobie z tym poradzić i uzyskać zawartość dobrze. –

+1

Wielkie dzięki za bounty. Cieszę się, że ci pomogło! – itsnikolay

Odpowiedz

5

Wystarczy dodaj:

# config/initializers/middlewares.rb 
require 'compressed_requests' 

Rails.application.configure do 
    config.middleware.insert_after Rack::Sendfile, CompressedRequests 
end 


# lib/compressed_requests.rb 
# Copy the file from the article 

Można przetestować go z:

# config/routes.rb 
post '/', to: 'welcome#create' 

# app/controllers/welcome_controller.rb 
class WelcomeController < ActionController::Base 
    def create 
    render json: params 
    end 
end 

A czy wniosek:

curl --data-binary @<(echo "Uncompressed data" | gzip) \ 
    -H "CONTENT_ENCODING: gzip" \ 
    localhost:3000 

{"Uncompressed data\n":null,"controller":"welcome","action":"create"}% 
3

to powinno działać po włożeniu middleware tuż przed Rack::Head

config.middleware.insert_before Rack::Head, "CompressedRequests" 

to powinno załatwić sprawę

można sprawdzić w aplikacji middleware stos za pomocą następującego polecenia

rake middleware 
+0

twoja odpowiedź jest prawie taka sama jak @itsnikolay, tylko zaakceptowałem jego zamiast twojego, ponieważ on położył trochę więcej wyjaśnień i testów. Ale dzięki i tak :) –

+0

i dodałem go pierwszy! haha, ale nie ma znaczenia tak długo, jak rozwiązał problem ur :) –

2

W pliku routes.rb:

post 'my_endpoint', to: 'api#my_endpoint' 

Na api_controller.rb:

class ApiController < ActionController::Base 
    def my_endpoint 
    render json: JSON.parse(ActiveSupport::Gzip.decompress(request.body.string)) 
    end 
end 

Przetestowałem to na zupełnie nowy Szyny 5 app przy użyciu klienta Paw:

enter image description here

+0

nie jest tak naprawdę dobrym rozwiązaniem, ponieważ jest specyficzne dla każdego działania i za każdym razem wykonujesz dekompresję ręcznie. –

+0

@DiegoPlentz, jeśli chcesz go ponownie użyć, możesz mieć metodę 'decompressed_body' trzymającą ważne bity (' JSON.parse (ActiveSupport :: Gzip.decompress (request.body.string)) '). Ta metoda może być używana w kontrolerze bazowym API lub w kontrolerze umożliwiającym ponowne użycie i utrzymanie kodu w stanie SUCHYM. – rebagliatte