亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 API GW 調用時,AWS Lambda Go 函數未獲取請求正文

通過 API GW 調用時,AWS Lambda Go 函數未獲取請求正文

Go
慕仙森 2023-03-29 17:08:26
首先,有人可能會說這個問題與HTTP request body not getting to AWS lambda function via AWS API Gateway或Getting json body in aws Lambda via API gateway非常相似但是,這些問題都沒有解決使用 Golang 的問題,我一直遇到的問題是找到event與 Node.js 文檔中各處使用的參數等效的參數。這是我的 Lambda 函數:package mainimport (    "context"    "encoding/json"    "github.com/aws/aws-lambda-go/lambda"    "github.com/aws/aws-lambda-go/events"    "log")type MyReturn struct {    Response string `json:"response"`}type APIGWResponse struct {    IsBase64Encoded bool              `json:"isBase64Encoded"`    StatusCode      int               `json:"statusCode"`    Headers         map[string]string `json:"headers"`    Body            string            `json:"body"`}func handle(ctx context.Context, name MyReturn) (APIGWResponse, error) {    log.Print("Called by ", name)    log.Print("context ", ctx)    headers := map[string]string{"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept"}    code := 200    response, error := json.Marshal(myReturn{Response:"Hello, " + name.Body})    if error != nil {        log.Println(error)        response = []byte("Internal Server Error")        code = 500    }    return APIGWResponse{true, code, headers, string(response)}, nil}func main() {    lambda.Start(handle)}問題:MyReturn從 API GW 調用時,對象未填充任何值。該行log.Print("Called by ", name)不會將任何內容附加到字符串Called by。請求 API GW: POST -> body: '{"name":"Bob"}', headers: {'Content-Type': 'application/json'}這是在純 JS 中執行的,如下所示:const BASE_URL = "https://my_api_id.execute-api.us-east-1.amazonaws.com/prod/";const TRIGGER_URL = "my_lambda_function";function toGW() {    fetch(BASE_URL + TRIGGER_URL, {        method: 'POST',        body: '{"name":"Bimesh"}',        headers:{            'Content-Type': 'application/json'        }    })    .then(data => data.json())    .then(json => console.log(json))    .catch(error => console.log(error));}然而,當從 AWS Lambda 控制臺對其進行測試時,完全相同的主體仍然有效。身體:{"name":"Bob"}
查看完整描述

1 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

事實證明,即使我無法在面向用戶的網站上找到任何關于此的文檔,文檔也確實存在。閱讀: https: //github.com/aws/aws-lambda-go/blob/master/events/README_ApiGatewayEvent.md


這是迄今為止我想出的從 API GW 接收數據和響應請求的最簡單方法:


package main


import (

    "context"

    "encoding/json"

    "github.com/aws/aws-lambda-go/lambda"

    "github.com/aws/aws-lambda-go/events"

    "log"

)


type myReturn struct {

    Response string `json:"response"`

}


func handle(ctx context.Context, name events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

    log.Print("Request body: ", name)

    log.Print("context ", ctx)

    headers := map[string]string{"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept"}


    code := 200

    response, error := json.Marshal(myReturn{Response:"Hello, " + name.Body})

    if error != nil {

        log.Println(error)

        response = []byte("Internal Server Error")

        code = 500

    }


    return events.APIGatewayProxyResponse {code, headers, string(response), false}, nil

}


func main() {

    lambda.Start(handle)

}

在這種情況下,該log.Print("Request body: ", name)行會記錄準確的請求正文。問題解決了。


注意:我也不必APIGWResponse從問題中創建那個對象,這events.APIGatewayProxyResponse是完全一樣的東西,已經為你做了。這些對象都在這個類里面: https: //github.com/aws/aws-lambda-go/blob/master/events/apigw.go


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號