2016-09-21 82 views
3

我已經創建了一個示例lambda函數來生成成功&錯誤響應。功能是類似下面Lambda只返回200 respose代碼

exports.handler = (event, context, callback) => { 
if(event.val1=="1") 
{ 
callback(null, 'success'); 
}else 
{ 
callback(true, 'fail'); 
} 
}; 

當我使用API​​網關已經測試了這個功能,我得到了不同的反應體,但響應代碼相同(總是返回200 OK響應代碼)。

是否可以定製來自lambda函數的狀態碼(例如:需要500個錯誤響應& 200個成功響應)?

+1

是http://stackoverflow.com/a/3137186​​2/1428388有用嗎? – jbird

回答

1

您可能想看看API網關的新簡化Lambda proxy功能。

使用此功能,您可以直接從Lambda定義狀態碼,返回標題和正文內容。從文檔

例子:

'use strict'; 
console.log('Loading hello world function'); 

exports.handler = function(event, context) { 
    var name = "World"; 
    var responseCode = 200; 
    console.log("request: " + JSON.stringify(event)); 
    if (event.queryStringParameters !== null && event.queryStringParameters !== undefined) { 
     if (event.queryStringParameters.name !== undefined && event.queryStringParameters.name !== null && event.queryStringParameters.name !== "") { 
      console.log("Received name: " + event.queryStringParameters.name); 
      name = event.queryStringParameters.name; 
     } 

     if (event.queryStringParameters.httpStatus !== undefined && event.queryStringParameters.httpStatus !== null && event.queryStringParameters.httpStatus !== "") { 
      console.log("Received http status: " + event.queryStringParameters.httpStatus); 
      responseCode = event.queryStringParameters.httpStatus; 
     } 
    } 

    var responseBody = { 
     message: "Hello " + name + "!", 
     input: event 
    }; 
    var response = { 
     statusCode: responseCode, 
     headers: { 
      "x-custom-header" : "my custom header value" 
     }, 
     body: JSON.stringify(responseBody) 
    }; 
    console.log("response: " + JSON.stringify(response)) 
    context.succeed(response); 
}; 
0

爲了發送從AWS API GW一個自定義的錯誤代碼,您應該在合併響應使用響應映射模板。 您基本上爲每個想要從API GW返回的狀態代碼定義一個正則表達式。

步驟:

使用這種配置的HTTP返回代碼由API GW返回給客戶端是與「selectionPattern」中的正則表達式匹配的那個。

最後我強烈建議使用API​​ GW框架來處理這些配置,Serverless是一個非常好的框架。

使用Servereless你如下(無服務器0.5片斷)可以定義模板:

myResponseTemplate: 
application/json;charset=UTF-8: | 
#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage'))) { 
    "status" : $errorMessageObj.status, 
    "error":{ 
     "error_message":"$errorMessageObj.error.message", 
     "details":"$errorMessageObj.error.custom_message" 
    } 
} 
responsesValues: 
'202': 
    selectionPattern: '.*"status": 202.*' 
    statusCode: '202' 
    responseParameters: {} 
    responseModels: {} 
    responseTemplates: '$${myResponseTemplate}' 
'400': 
    selectionPattern: '.*"status": 400.*' 
    statusCode: '400' 
    responseParameters: {} 
    responseModels: {} 
    responseTemplates: '$${myResponseTemplate}' 

然後簡單地從你的拉姆達返回一個JSON對象,如下面的Python代碼片段(可以使用類似方法nodejs):

def handler(event, context): 
    # Your function code ... 
    response = { 
     'status':400, 
     'error':{ 
      'error_message' : 'your message', 
      'details' : 'your details' 
      } 
    } 
    return response 

我希望這有助於。

G.