Aws lambda 在API网关上将base64字符串作为应用程序/pdf处理为单个端点

Aws lambda 在API网关上将base64字符串作为应用程序/pdf处理为单个端点,aws-lambda,aws-api-gateway,serverless,api-gateway,Aws Lambda,Aws Api Gateway,Serverless,Api Gateway,正如您所期望的,我们有一个具有多个不同端点的API。我们需要添加一个新的端点,该端点将返回一个application/pdf以及文件数据 为此,我们返回以下内容: return { statusCode: 200, headers: { 'Content-Type': 'application/pdf', 'Content-disposition': `attachment; filename=${filename}.pdf

正如您所期望的,我们有一个具有多个不同端点的API。我们需要添加一个新的端点,该端点将返回一个application/pdf以及文件数据

为此,我们返回以下内容:

return {
        statusCode: 200,
        headers: {
          'Content-Type': 'application/pdf',
          'Content-disposition': `attachment; filename=${filename}.pdf`,
          'Accept': 'application/pdf',
        },
        body: fileData,
        isBase64Encoded: true,
      };
isBase64Encoded
仅在API网关中设置二进制媒体类型时才起作用。详情如下:

我们遇到的问题是,通过在API网关上将二进制媒体类型设置为*/*(无空格),这反过来会影响API上的所有其他端点

示例这会在选项cors检查中中断一个端点,无理由返回InternalServerErrorException。该端点只是一个GET,请求中没有数据

这是否意味着我们只需要为这一个端点使用一个单独的API,或者有没有办法将其包含在同一个APIG中


为了进一步澄清,这是一篇在请求中包含少量JSON的帖子:
{“someValue”:1234}
并返回上述应用程序/pdf内容类型。

我正在处理这个问题,并像这样解决它:

  • 发送base64字符串,就像发送普通json响应一样,并在客户端处理pdf部分
  • 然后在客户机上(在我的例子中是Nuxt):

  • 这将打开一个下载窗口,让您将文件保存到本地

    我正在解决此问题,并按如下方式解决此问题:

  • 发送base64字符串,就像发送普通json响应一样,并在客户端处理pdf部分
  • 然后在客户机上(在我的例子中是Nuxt):

  • 这将打开一个下载窗口,让您在本地保存文件

    您是否解决了此问题?我接近解决它的唯一方法是将端点从代理lambda集成切换到非代理lambda集成。虽然这会引发它自己的问题。你解决了这个问题吗?我接近解决它的唯一方法是将端点从代理lambda集成切换到非代理lambda集成。尽管这会引发它自己的问题。
    const sendRes = (status:number, body:any) => {
      var response = { statusCode: status, headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) };
      return response;
    };
      return sendRes(201, {pdf:your-base64-string} );
    
     let res = await this.$store.dispatch('pdf/makePdf')
    
          const linkSource = `data:application/pdf;base64,${res.data.pdf}`;
          const downloadLink = document.createElement("a");
          const fileName = "your-pdf-filename.pdf";
          downloadLink.href = linkSource;
          downloadLink.download = fileName;
          downloadLink.click();