【问题标题】:How can I redirect a URL for post request using AWS lambda?如何使用 AWS lambda 重定向发布请求的 URL?
【发布时间】:2019-10-03 03:42:35
【问题描述】:

这些结果适用于通过 API 网关和 lambda 响应的 GET 和 POST 请求。使用相同的 lambda 函数,但是当我使用 API 网关的 post 方法时,响应只显示 JSON。我该怎么办?

when i used post req

when i used get req 这是我的 lambda 函数

exports.handler = (event, context, callback) => {
   const response = {
    statusCode: 301,
    headers: {
      Location: 'https://google.com',
    }
  };

  return callback(null, response);
}

谢谢。

【问题讨论】:

    标签: javascript amazon-web-services redirect aws-lambda gateway


    【解决方案1】:

    在定义我的 aws lambda 时,我通常使用新的 async/await 模式:

    exports.handler = async (event) => {
     // do stuff...
    }
    

    您通常不需要context,除非您想使用有关您的 lambda 的一些与 aws 相关的信息。 我有一个在代码库中被大量重复使用的辅助函数

    function proxyResponse(inBody, inStatusCode = null, headers = {}, event = null) {
      if (!isApiGateway(event)) {
        if (inBody instanceof Error) {
          throw inBody;
        }
        return inBody;
      }
      let statusCode = inStatusCode;
    
      let body;
      if (inBody instanceof Error) {
        statusCode = statusCode || INTERNAL_SERVER_ERROR;
        body = JSON.stringify({
          message: inBody.message,
          code: statusCode,
        });
      } else if (inBody instanceof Object) {
        body = JSON.stringify(inBody);
      } else {
        body = inBody;
      }
    
      const [origin] = event ? caseHandler(event.headers, 'origin') : [];
    
      return {
        statusCode: statusCode || 200,
        body,
        headers: Object.assign({
          'Access-Control-Allow-Headers': 'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token,x-api-key,Authorization',
          'Access-Control-Allow-Origin': origin,
          'Access-Control-Allow-Credentials': true,
          'Access-Control-Allow-Methods': 'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT',
        }, headers),
      };
    }
    

    还有一个:

    function caseHandler(mixedCaseObject, inputKey) {
      if (!mixedCaseObject || !inputKey) {
        return [];
      }
      return Object.keys(mixedCaseObject)
        .filter((key => key.toLowerCase() === inputKey.toLowerCase()))
        .map(key => mixedCaseObject[key]);
    }
    

    还有这个:

    function isApiGateway(event) {
      return (!!event.httpMethod && !!event.headers && !!event.requestContext);
    }
    

    所以每当我想返回一些东西时,我都会在 lambda 内部使用这个辅助函数:

    module.exports.handler = async (event) => {
      try{
     // do stuff...
     return proxyResponse(YOUR_CUSTOM_BODY_OBJECT, Api.HTTP.OK, {}, event);
     } catch(error) {
     return proxyResponse(error, Api.HTTP.INTERNAL_SERVER_ERROR, {}, event);
     }
    }
    

    【讨论】:

      【解决方案2】:

      GET 请求将返回响应中提供的任何内容。在这种情况下,它是 JSON 对象 response。对于 POST 请求,相同的 response 对象被返回给 API 网关,然后 API 网关按原样返回给客户端。

      也许这里的文档可以帮助https://docs.aws.amazon.com/en_pv/apigateway/latest/developerguide/api-gateway-integration-settings-integration-response.html

      【讨论】:

        猜你喜欢
        • 2019-06-08
        • 2019-09-19
        • 1970-01-01
        • 2022-09-27
        • 2017-09-17
        • 2019-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多