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


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