Я создал 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.
Я думаю, что мне не хватает здесь Двоичные типы носителей настройки и Метод ответа настройки. Ниже мои настройки. Не уверен, что эти настройки верны
Двоичные носители
Метод ответа