Быстрая повторная отправка ответа в golang lambda - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть 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 в нем - нужны строки и такие же манипуляции

1 Ответ

0 голосов
/ 25 февраля 2019

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

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

  • Если лямбда-функция заключается в том, чтобы только прокси-ответ от поиска 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
}
...