当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda Go函数在通过API GW调用时未获得请求正文

祁修诚
2023-03-14

首先,可以说这个问题非常类似于HTTP请求主体没有通过AWS API网关获得AWS lambda函数,或者通过API网关获得AWS lambda中的json主体

但是,这些问题都没有解决Golang的使用问题,我一直遇到的问题是找到一个与node.js文档中到处使用的event参数相当的参数。

下面是我的Lambda函数:

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"`
}

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)
}
 POST -> body: '{"name":"Bob"}', headers: {'Content-Type': 'application/json'}
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));
}

车身:

{"name":"Bob"}

共有1个答案

东门彬
2023-03-14

结果是,即使我在面向用户的网站上找不到任何关于这方面的文档,文档确实存在。阅读: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)行将导致记录确切的请求正文。问题解决了。

 类似资料:
  • 问题内容: 首先,可能会说这个问题与HTTP请求正文非常相似,即它没有通过AWS API Gateway到达AWS Lambda函数,或者没有通过API网关在AWSLambda中获取json正文 但是,这些问题都没有解决使用Golang的问题,而我一直遇到的问题是找到与Node.js文档中各处使用的参数等效的参数。 这是我的Lambda函数: 问题:从API GW调用时,对象未填充任何值。该行导致

  • 是否可以通过http请求(GET或POST)直接调用AWS Lambda函数?如果没有,是否有通过SNS或S3的解决方案?因为我想不出一个。。。 具体来说,我想使用 JSON 创建一个小的 API

  • 如果我添加了一个特定的方法,比如POST而不将其设置为Lambda代理集成,那么我确实会看到provide request body data将其添加到Lambda函数中,并正确地反序列化到POJO中,然后返回 所以现在看起来一切都很好,但是当我使用HTTP方法POST对来自PostMan的AWS API URL进行实际测试时,我得到了以null作为约会Id的响应,并且我可以在CloudWatch

  • 我的应用程序是一个非WebSpring启动应用程序,使用WebClient进行内部get调用。 每次我启动它时,它都会返回我。 问题与webclient调用有关:当我执行block()时,一切正常。当我试图让它保持被动时,它抛出一个异常。 以下是我的主要方法: 这是我的网络客户电话: 以下是异常跟踪:

  • 如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。 下面的代码声明一个加法函数,传入两个整型值,返回两个整型值的和。将函数保存到反射值对象(refle

  • 我正在使用PHP和SQL生成一个数组,该数组计算具有相同值的数据,以及这些值中有多少输出json_encode到: <代码>{“05”:4,“09”:4,“19”:4} Chart.js文件:(向下修剪) console.log输出 但是,如果我将罪行放入数据部分,它就不起作用了?