Повторная настройка потока в AWS API Gateway -> Лямбда-функция? - PullRequest
0 голосов
/ 09 января 2019

Я создал API, используя шлюз API AWS, как https://api.mydomain.com/v1/download?id=1234". Ресурс download имеет метод GET. И метод GET вызывает функцию lambda, используя Lambda Proxy Integration.

Лямбда-функция должна действовать как прокси. Он должен разрешить правильную конечную точку бэкэнда на основе заголовка x-clientId, а затем направить запрос этой конечной точке бэкенда и вернуть ответ таким, какой он есть. Поэтому он должен быть универсальным для обработки GET-запроса другого типа содержимого.

Моя лямбда-функция выглядит так (.NET Core)

public async Task<APIGatewayProxyResponse> Route(APIGatewayProxyRequest input, ILambdaContext context)
{
    var clientId = headers["x-clientId"];            
    var mappings = new Mappings();
    var url = await mappings.GetBackendUrl(clientId, input.Resource);       

    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(url);
    response.EnsureSuccessStatusCode();

    var proxyResponse = new APIGatewayProxyResponse()
    {
        Headers = new Dictionary<string, string>(),
        StatusCode = (int)System.Net.HttpStatusCode.OK,
        IsBase64Encoded = false,
        Body = await response.Content.ReadAsString())
    };            
}

Приведенный выше обработчик работает, пока для запроса и ответа content-type равен application/json или application/xml. Однако я не уверен, как обрабатывать ответ, когда сервер возвращает поток.

Для API загрузки серверная часть возвращает Content-Disposition: attachment; filename="somefilename, а ContentType может быть одним из следующих:
application/pdf
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
application/vnd.openxmlformats-officedocument.wordprocessingml.document
application/x-zip-compressed
application/octet-stream

Для этих потоков, как мне установить APIGatewayProxyResponse.Body?

Для файла Excel я попытался установить тело, как показано ниже

    var proxyResponse = new APIGatewayProxyResponse()
    {
        Headers = new Dictionary<string, string>(),
        StatusCode = (int)System.Net.HttpStatusCode.OK,
        IsBase64Encoded = true,
        Body = Convert.ToBase64String(await response.Content.ReadAsByteArrayAsync())
    };  

proxyResponse.Headers.Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
proxyResponse.Headers.Add("Content-Disposition", "attachment; filename=\"Report.xlsx\"");

Когда я получаю доступ к URL из браузера и пытаюсь открыть файл. Я получаю ошибку

Excel cannot open the file Report.xlsx becuase the file format or file extension is not valid. Verify that the file has not been corrupted and that the extention matches the format of the file

Я думаю, что проблема в том, как я устанавливаю тело ответа

Обновление 1
Так, на основе AWS doc Двоичные данные теперь поддерживаются API Gateway. Теперь согласно документации

вы можете указать, хотите ли вы, чтобы API-шлюз проходил Интегрируйте тела запросов и ответов через, конвертируйте их в текст (Кодировка Base64) или преобразовать их в двоичный код (декодирование Base64). Эти доступны параметры HTTP, AWS Service и HTTP Proxy интеграций. В случае лямбда-функции и лямбда-функции прокси Интеграции, которые в настоящее время поддерживают только JSON, тело запроса всегда преобразуется в JSON.

Я использую Lambda Function Proxy, который в настоящее время поддерживает JSON. Однако пример здесь показывает, как это сделать с Lambda Proxy.
Я думаю, что мне не хватает здесь Двоичные типы носителей настройки и Метод ответа настройки. Ниже мои настройки. Не уверен, что эти настройки верны

Двоичные носители
enter image description here

Метод ответа enter image description here

1 Ответ

0 голосов
/ 14 января 2019

вот как это решено

1> добавить Binary Media Types. API-> Настройки-> Бинарные типы носителей -> Добавить application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

2> В метод ответа Добавить заголовки Content-Disposition и Content-Type для состояния 200

enter image description here

3> В Integration Response сопоставьте эти заголовки с заголовками, исходящими из серверной части. А также установить обработку контента convert to binary. (наш бэкэнд API возвращает файл blob в теле)

enter image description here

...