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?
Odpowiedz
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"}%
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
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 :) –
i dodałem go pierwszy! haha, ale nie ma znaczenia tak długo, jak rozwiązał problem ur :) –
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:
nie jest tak naprawdę dobrym rozwiązaniem, ponieważ jest specyficzne dla każdego działania i za każdym razem wykonujesz dekompresję ręcznie. –
@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
Jeśli masz Nginx przed jednorożce, to można po prostu powiedzieć Nginx do dekompresji danych dla ciebie
http://www.pataliebre.net/howto-make-nginx-decompress-a-gzipped-request.html#.WBzSt-ErIUE
https://www.nginx.com/resources/admin-guide/compression-and-decompression/
to nie działa. tylko dekompresuje odpowiedzi, a nie żądania. –
Witam @DiegoPlentz, proszę sprawdź moją zaktualizowaną odpowiedź – Tilo
to lepiej :) –
czy to działa, jeśli włożysz je przed 'actio nDispatch :: Cookies'? Które jest oprogramowaniem pośredniczącym i nadal istnieje. –
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. –
Wielkie dzięki za bounty. Cieszę się, że ci pomogło! – itsnikolay