API의 요청 및 응답 파라미터와 상태 코드를 재정의하는 예시 - Amazon API Gateway

API의 요청 및 응답 파라미터와 상태 코드를 재정의하는 예시

다음 예시에서는 매핑 템플릿 재정의를 생성하고 테스트는 방법을 보여줍니다. 처음 두 예시에서는 AWS Management Console 및 예시 API를 시작점으로 사용합니다. 마지막 두 예시에서는 JavaScript용 AWS CLI 및 SDK를 사용합니다.

AWS Management Console을 사용하여 API의 응답 상태 코드 재정의

PetStore 샘플 API를 사용하여 반려 동물을 검색하려면 GET /pets/{petId}의 API 메서드 요청을 사용합니다. 여기에서 {petId}는 실행 시간에 숫자를 받아들일 수 있는 경로 파라미터입니다.

이 예시에서는 오류 조건을 감지했을 때 $context.responseOverride.status400으로 매핑하는 매핑 템플릿을 생성하여 이 GET 메서드의 응답 코드를 재정의합니다.

  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. API에서 PetStore API를 선택한 다음 리소스를 선택합니다.

  3. 리소스 트리에서, /{petId} 아래의 GET 메서드를 선택합니다.

  4. 테스트 탭을 선택합니다. 탭을 표시하려면 오른쪽 화살표 버튼을 선택해야 할 수도 있습니다.

  5. petId-1을 입력한 다음 테스트를 선택합니다.

    결과에 두 가지 사실이 보입니다.

    첫째, 응답 본문은 범위 밖 오류를 가리킵니다.

    { "errors": [ { "key": "GetPetRequest.petId", "message": "The value is out of range." } ] }

    둘째, 로그 상자의 마지막 줄이 Method completed with status: 200으로 끝납니다.

  6. 통합 응답 탭의 기본값 - 응답에서 편집을 선택합니다.

  7. 매핑 템플릿을 선택합니다.

  8. 매핑 템플릿 추가(Add mapping template)를 선택합니다.

  9. 콘텐츠 유형에 application/json을 입력합니다.

  10. 템플릿 본문에 다음을 입력합니다.

    #set($inputRoot = $input.path('$')) $input.json("$") #if($inputRoot.toString().contains("error")) #set($context.responseOverride.status = 400) #end
  11. Save(저장)를 선택합니다.

  12. 테스트 탭을 선택합니다.

  13. petId-1을 입력합니다.

  14. 결과에서 응답 본문(Response Body)은 범위 밖 오류를 가리킵니다.

    { "errors": [ { "key": "GetPetRequest.petId", "message": "The value is out of range." } ] }

    그러나 로그 상자의 마지막 줄은 이제 Method completed with status: 400으로 끝납니다.

AWS Management Console를 사용한 API의 요청 파라미터 및 헤더 재정의

이 예시에서는 다른 두 헤더를 결합하는 새 헤더 하나로 GET을 매핑하는 매핑 템플릿을 생성하여 $context.requestOverride.header.header_name 메서드의 요청 헤더 코드를 재정의합니다.

  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. API에서 PetStore API를 선택합니다.

  3. 리소스 트리에서, /pet 아래의 GET 메서드를 선택합니다.

  4. 메서드 요청 탭의 메서드 요청 설정에서 편집을 선택합니다.

  5. HTTP 요청 헤더를 선택한 다음, 헤더 추가를 선택합니다.

  6. 이름header1을 입력합니다.

  7. 헤더 추가를 선택한 다음 header2라는 두 번째 헤더를 생성합니다.

  8. Save(저장)를 선택합니다.

  9. 통합 요청 탭의 통합 요청 설정에서 편집을 선택합니다.

  10. 요청 본문 패스스루에서 정의된 템플릿이 없는 경우(권장)를 선택합니다.

  11. 매핑 템플릿을 선택한 후 다음을 수행합니다.

    1. 매핑 템플릿 추가(Add mapping template)를 선택합니다.

    2. 콘텐츠 유형에 application/json을 입력합니다.

    3. 템플릿 본문에 다음을 입력합니다.

      #set($header1Override = "foo") #set($header3Value = "$input.params('header1')$input.params('header2')") $input.json("$") #set($context.requestOverride.header.header3 = $header3Value) #set($context.requestOverride.header.header1 = $header1Override) #set($context.requestOverride.header.multivalueheader=[$header1Override, $header3Value])
  12. Save(저장)를 선택합니다.

  13. 테스트 탭을 선택합니다.

  14. {pets}헤더(Headers)에 다음 코드를 복사합니다.

    header1:header1Val header2:header2Val
  15. 테스트를 선택합니다.

    로그에 다음 텍스트가 포함된 항목이 보입니다.

    Endpoint request headers: {header3=header1Valheader2Val, header2=header2Val, header1=foo, x-amzn-apigateway-api-id=<api-id>, Accept=application/json, multivalueheader=foo,header1Valheader2Val}

AWS CLI를 사용한 API의 요청 파라미터 및 헤더 재정의

다음 CLI 예시는 put-integration 명령을 사용하여 응답 코드를 재정의하는 방법을 보여줍니다.

aws apigateway put-integration --rest-api-id <API_ID> --resource-id <PATH_TO_RESOURCE_ID> --http-method <METHOD> --type <INTEGRATION_TYPE> --request-templates <REQUEST_TEMPLATE_MAP>

여기에서 <REQUEST_TEMPLATE_MAP>은(는) 콘텐츠 유형에서 템플릿 문자열로 적용하는 맵입니다. 그 맵의 구조는 다음과 같습니다.

Content_type1=template_string,Content_type2=template_string

또는 JSON 구문에서:

{"content_type1": "template_string" ...}

다음 예시는 put-integration-response 명령을 사용하여 API의 응답 코드를 재정의하는 방법을 보여줍니다.

aws apigateway put-integration-response --rest-api-id <API_ID> --resource-id <PATH_TO_RESOURCE_ID> --http-method <METHOD> --status-code <STATUS_CODE> --response-templates <RESPONSE_TEMPLATE_MAP>

여기에서 <RESPONSE_TEMPLATE_MAP>의 형식은 <REQUEST_TEMPLATE_MAP>와(과) 동일합니다.

JavaScript용 SDK를 사용한 API의 요청 파라미터 및 헤더 재정의

다음 예시는 put-integration 명령을 사용하여 응답 코드를 재정의하는 방법을 보여줍니다.

요청:

var params = { httpMethod: 'STRING_VALUE', /* required */ resourceId: 'STRING_VALUE', /* required */ restApiId: 'STRING_VALUE', /* required */ type: HTTP | AWS | MOCK | HTTP_PROXY | AWS_PROXY, /* required */ requestTemplates: { '<Content_type>': 'TEMPLATE_STRING', /* '<String>': ... */ }, }; apigateway.putIntegration(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response });

응답:

var params = { httpMethod: 'STRING_VALUE', /* required */ resourceId: 'STRING_VALUE', /* required */ restApiId: 'STRING_VALUE', /* required */ statusCode: 'STRING_VALUE', /* required */ responseTemplates: { '<Content_type>': 'TEMPLATE_STRING', /* '<String>': ... */ }, }; apigateway.putIntegrationResponse(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response });