Быстрый повторный ответ в golang lambda

У меня есть golang lambda, который готовит запрос ES, отправляет его во внешнюю систему и возвращает ответ. В настоящее время я не нашел лучшего подхода, чем неупорядоченный ответ на interface{}.

func HandleRequest(ctx context.Context, searchRequest SearchRequest) (interface{}, error) {
    // ... some data preparation and client initalisation
    resp, err := ctxhttp.Post(ctx, &client, url, "application/json", buffer)
    if err != nil {
        return "", err
    }
    var k interface{}
    all, err := ioutil.ReadAll(resp.Body)
    err = json.Unmarshal(all, &k)
    return k, err
}

Я не уверен, что это самый быстрый и эффективный способ переслать ответ из-за дополнительных ReadAll и Unmarshall. Есть ли более эффективный подход? Смотрел на events.APIGatewayProxyResponse{}, а в нем body - нужна строка и такие же манипуляции

За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
0
0
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете обрабатывать ответ разными способами

  • Если лямбда реализует дополнительную обработку ответов поиска, возможно, стоит определить контракт типа данных ответа с соответствующей логикой маршалинга/демаршалинга и дополнительной обработки.

  • Если лямбда-функция предназначена только для прокси-ответа от поиска ES, вы можете просто передать полезную нагрузку ответа на поиск ([] байт) непосредственно в APIGatewayProxyResponse.Body как [] байт и, возможно, потребуется base64, если полезная нагрузка имеет двоичные данные.

Код:

func handleRequest(ctx context.Context, apiRequest events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    request, err := newSearchRequest(apiRequest)
    if err != nil {
        return handleError(err)
    }
    responseBody, err := proxySearch(ctx, request)
    if err != nil {
        return handleError(err)
    }
    return events.APIGatewayProxyResponse{
        StatusCode: http.StatusOK,
        Body:       string(responseBody),
    }, nil
}

func proxySearch(ctx context.Context, searchRequest SearchRequest) ([]byte, error) {
    // ... some data preparation and client initalisation
    resp, err := ctxhttp.Post(ctx, &client, url, "application/json", buffer)
    if err != nil {
        return nil, err
    }
    responseBody, err := ioutil.ReadAll(resp.Body)
    return responseBody, err
}

Другие вопросы по теме