API Gateway에서 Lambda를 호출할 때 event.body를 객체로 수신
                                            
                                                
                                                
                                                
                                                
                                                
                                                 10582 단어  APIGateway람다자바스크립트AWS
                    
소개
AWS API Gateway에서 Lambda를 호출하는 것이 자주 있다고 생각합니다.
Lambda에서는 event.body에서 요청 본문을 얻을 수 있지만,
기본적으로이 body는 문자열이므로,Content-Type:application/json 의 경우도 「JSON 캐릭터 라인」이 됩니다.
그 때문에 한번 JSON을 퍼스 해 주지 않으면 안됩니다.
예를 들어 Node.js의 경우는 이런 느낌.
index.jsexports.handler = async (event) => {
    const body = JSON.parse(event.body);
    console.log('api received!', body);
    const response = {
        statusCode: 200,
        body: JSON.stringify([body.hoge, body.fuga, body.piyo]),
    };
    return response;
};
코드측에서 JSON.parse() 하는 것 자체는 큰 수고는 아닙니다만,
귀찮은 것이 테스트입니다.
Lambda의 "테스트 이벤트 설정"에서 이런 느낌으로 쓰고 싶어요.
{
  "body": {
    "hoge": 1,
    "fuga": 2,
    "piyo": 3
  }
}
그러나 이것은 'JSON 문자열'이 아닌 'JSON 객체'이므로,
API Gateway event.body와 호환되지 않습니다.
이렇게 해야 한다. . .
{
  "body": "{\"hoge\":1,\"fuga\":2,\"piyo\":3}"
}
 
이거 네,,,, 힘들군요.
더블 쿼트의 이스케이프 폭풍으로, 사쿠와 필기로 쓰는 것은 무리입니다.
 해결 방법
API Gateway의 매핑 템플릿이라는 기능을 사용하면,
제대로 JSON을 개체로 만든 다음 Lambda로 날 수 있습니다.
 Lambda 측 트리거 설정에서 새 REST API 생성
exports.handler = async (event) => {
    const body = JSON.parse(event.body);
    console.log('api received!', body);
    const response = {
        statusCode: 200,
        body: JSON.stringify([body.hoge, body.fuga, body.piyo]),
    };
    return response;
};
{
  "body": {
    "hoge": 1,
    "fuga": 2,
    "piyo": 3
  }
}
{
  "body": "{\"hoge\":1,\"fuga\":2,\"piyo\":3}"
}
API Gateway의 매핑 템플릿이라는 기능을 사용하면,
제대로 JSON을 개체로 만든 다음 Lambda로 날 수 있습니다.
Lambda 측 트리거 설정에서 새 REST API 생성

API Gateway 리소스 설정

 
 매핑 템플릿 설정

body-json 는 camelCase bodyJsonbody 하지만 OK 
 ##  This template will pass through all parameters including path, querystring, header, stage variables, and context through to the integration endpoint via the body/payload
 #set($allParams = $input.params())
 {
-"body-json" : $input.json('$'),
+"bodyJson" : $input.json('$'),
 "params" : {
 #foreach($type in $allParams.keySet())
     #set($params = $allParams.get($type))
API 배포


Lambda의 수정 버전 및 실행 결과
'람다 프록시 통합 사용'이 벗어나면,
응답을 만드는 방법도 바뀝니다.
statusCode 는 API Gateway 측에서 정의하므로,Lambda에서는 간단하게, 정상계의 리스폰스를 그대로
return 할 뿐.index.js
exports.handler = async (event) => {
    const body = event.bodyJson;
    console.log('api received!', body);
    return [body.hoge, body.fuga, body.piyo];
};
Lambda 테스트 이벤트
{
  "bodyJson": {
    "hoge": 1,
    "fuga": 2,
    "piyo": 3
  }
}
PC 터미널에서 curl로 API 치고 테스트
$ curl -X POST https://example.amazonaws.com/default/mappingTemplateTest -H 'Content-Type:application/json' -d '{"hoge":1,"fuga":2,"piyo":3}'
[1,2,3]                                                  
좋은 느낌이네요!
참고 사이트
AWS 공식
* REST API의 데이터 변환 설정
* API Gateway에서 Lambda 프록시 통합 구성
블로그 Qiita
* [AWS] API Gateway 본문 매핑 템플릿 이해
* API Gateway + Lambda에서 Form에서 POST 할 때 매핑 템플릿을 만들었습니다.
* API Gateway 매핑 템플릿 설정 예
그럼 또~.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(API Gateway에서 Lambda를 호출할 때 event.body를 객체로 수신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/the_red/items/e5808f3ceda64bef73e4
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
Reference
이 문제에 관하여(API Gateway에서 Lambda를 호출할 때 event.body를 객체로 수신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/the_red/items/e5808f3ceda64bef73e4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)