Как включить сжатие gzip на шлюзе API?

#laravel #amazon-web-services #aws-api-gateway #laravel-vapor

Вопрос:

У меня возникли некоторые проблемы с включением сжатия gzip на шлюзе API. Я использую Laravel Vapor, который использует AWS Lambda под капотом.

Я просмотрел панель управления консоли шлюза API в поисках настроек, но безрезультатно. У меня есть настройка CORS в моем приложении, и у меня включено следующее:

 'allowedHeaders' => [
        'Accept',
        'Accept-Encoding',
        'Authorization',
        'Access-Control-Expose-Headers',
        'Content-Type',
        'X-Requested-With',
        'Origin',
        'X-Shadow-Progress',
        'X-Socket-ID',
        'x-socket-id'
    ],
 

У меня сложилось впечатление, что установка Accept-Encoding в моем бэкэнде сделает свое дело, но это просто не работает. Заголовки ответов Content-Encoding: gzip в них никогда не содержались.

Ответ №1:

Я запускаю несколько проектов на Vapor. Я забыл, нужно ли было делать что-то особенное внутри API-шлюза, чтобы это работало, но я создал часть промежуточного программного обеспечения, которое загружает ответы, что делает для нас трюк:

 <?php

namespace AppHttpMiddleware;

use Closure;
use IlluminateHttpRequest;

class GzipEncodeResponse
{
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);

        if (in_array('gzip', $request->getEncodings()) amp;amp; function_exists('gzencode')) {
            $response->setContent(gzencode($response->getContent(), 9));
            $response->headers->add([
                'Content-Encoding' => 'gzip',
                'X-Vapor-Base64-Encode' => 'True',
            ]);
        }
        return $response;
    }
}
 

Это проверяет, что запрос принимает кодировку gzip, и если это так, то gzip-кодирует ответ и добавляет некоторые необходимые заголовки, чтобы заставить это работать.

Обновление; С момента написания этого ответа я понял, что в Google не так много контента, объясняющего, как это сделать. Я подробно описал этот подход и немного больше о том, что происходит, в сообщении в блоге на моем сайте.

Комментарии:

1. Спасибо @James. Попробую ваше решение. У меня все еще складывается впечатление, что API-шлюз должен решать эти проблемы, так как чаще всего это происходит на уровне сервера.

Ответ №2:

Шлюз API AWS поддерживает сжатие ( gzip и deflate ). Его просто немного трудно найти. Вы можете включить его либо через настройки шлюзов в консоли AWS, либо через интерфейс командной строки AWS.

В консоли AWS выберите свой шлюз API, а затем вы можете найти его в разделе Настройки > >Кодирование содержимого (см. Изображение ниже).

как включить сжатие в консоли AWS

Документация: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-enable-compression.html

Комментарии:

1. Я не вижу этого пользовательского интерфейса. Мой пользовательский интерфейс совершенно другой.

2. Вы уверены, что используете API-шлюз? В противном случае, может быть, ваш регион отличается? Можете ли вы проверить us-восток-1 или eu-запад-1? Они должны выглядеть так, когда вы выбираете шлюз API.