我有准备ES请求,将其发送到外部系统并返回其响应的golang lambda。目前,除了对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
–需要字符串和相同的操作
答案 0 :(得分:0)
您可以通过多种不同方式处理响应
如果lambda实现附加的搜索响应处理,则可能有必要使用相应的封送/拆组和附加处理逻辑来定义响应数据类型协定。
如果lambda功能仅用于来自ES搜索的代理响应,则可以将搜索响应有效负载([] byte)直接传递给APIGatewayProxyResponse.Body作为[] byte,如果有效负载具有二进制数据,则可能需要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
}