API Gateway REST API 集成 S3 服务自定义 404 页面

news2025/5/20 13:54:22

需求分析

使用 API Gateway REST API 可以直接使用 S3 作为后端集成对外提供可以访问的 API. 而当访问的 URL 中存在无效的桶, 或者不存在的对象时, API Gateway 默认回向客户端返回 200 状态码. 而实际上这并不是正确的响应, 本文将介绍如何自定义返回 404 错误页面.

基本功能配置

基本功能的配置过程可以参考文档 https://docs.amazonaws.cn/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html

整理记录主要步骤:

  • 创建一个 REST API, 在 Resources 根路径 / 创建新的资源, 不要开启 Proxy resource 选项(后面创建的也都不开), 资源名称定义变量 {folder}

  • /{folder} 下面继续创建资源 {item}, 完成的结构:

    /
      /{folder}
        /{item}
    
  • /{folder} 中创建 GET 方法, 完成相应配置. 需要注意 Action type 选择 Use path override, 并在 Path override 指定使用新的变量 {bucket}, 这个变量后面会和 URL 中的 {folder} 进行映射, 现在创建期间先不做配置. 另外所填入的 Execution role 也需要确认在信任关系中允许 API Gateway, 并且 Policy 中允许对目标 S3 存储桶和对象进行操作.

在这里插入图片描述

  • 切换到 “Integration request”, 点击右上角的 “Edit” 按钮, 参考下图配置 URL path parameters.
    在这里插入图片描述

其中 Name=bucket 对应的是我们在上面的 Path override 中定义的变量名称, Mapped from 中的表达式 method.request.path.folder 则表示会从请求信息中解析 Resource 定义 URL 地址中的 folder 变量

在这里插入图片描述

  • 完成配置后即可切换到 Test 标签页, 在 Path 下方的 folder 中填入 S3 桶名称进行测试, 确认可以在下方的输出面板中看到 XML 格式的返回结果.

  • 继续在 /{item} 中创建 GET 方法, 配置项和 /{folder} 基本一致, 只需要修改 Path override 内容为 {bucket}/{object}. 创建完成后再次编辑 Integration request settings 中的 URL path parameters, 分别添加两个参数, 其中新增的 object 参数和前面的 bucket 一样, 都将通过 method.request.path 进行映射.

NameMapped from
bucketmethod.request.path.folder
objectmethod.request.path.item

在这里插入图片描述

  • Deploy 到新创建的 Stage dev, 随后从浏览器测试访问 Stage 对应的 Invoke URL 后面带上参数确认工作正常, 注意访问地址中需要包含 Stage 名称 dev, 例如:
    https://abc12345.execute-api.cn-northwest-1.amazonaws.com.cn/dev/my-bucket/my-data.json

至此, 和文档一致的配置就完成了. 此时如果我们尝试访问不存在的 S3 对象, 浏览器会直接返回一个 200 状态码的 XML 格式字符串内容, 例如:

在这里插入图片描述

下面我们就来配置自定义的 404 页面.

定制 404 页面

首先梳理需求, 对于当前资源的结构来说, 我们希望在访问 API 根路径以及各个子路径的默认 URL 时, 还有对于访问不存在的 S3 对象时均返回自定义的 404 页面. 具体来说:

访问路径期望效果
/404 页面
/有效桶正常对象列表
/无效桶404 页面
/有效桶/有效对象正常对象
/有效桶/无效对象404 页面

根路径 /

当前配置如果直接访问 Stage URL 的根路径(包含 Stage 名称), 浏览器会返回 403 错误:

{“message”:“Missing Authentication Token”}

我们在 Resource / 位置直接创建 GET 方法, 类型选择 Mock, 直接完成创建.

在这里插入图片描述

Deploy 之后再次访问根路径, 观察浏览器返回了 200 状态的一个空白页面, Response header 中的 Content-Type 显示为 application/json

我们切换到 Integration response 标签页, 先删除默认的 Default - Response, 再切换到 Method responses 删除默认的 Response 200, 随后点击 Create response 创建状态码为 404 的响应, 点击 Add model 设置 Content type 为 text/html, Model 使用默认的 Empty.
在这里插入图片描述

再切回 Integration responses, Create response, 直接创建
在这里插入图片描述

完成后的 Integration response 中默认响应变成了 404 状态码
在这里插入图片描述

Deploy 后测试访问根路径, 可以看到浏览器显示报错, 观察开发者工具中的 Network 请求记录, 收到的 HTTP 响应状态码为 404.
在这里插入图片描述

状态码有了, 接下来就是我们要自定义 404 响应对应的 HTML 页面内容. 再次打开 Resource 根路径的 GET 方法 Integration responses 标签页, 编辑现在默认的 404 Response, 展开 Mapping templates > Add mapping template. 设置 Content type = text/html, 下方的 Template body 中填入我们要自定义的 HTML 代码.

在这里插入图片描述

保存后再次 Deploy, 浏览器 刷新访问 开个新的标签页访问. 实现效果:
在这里插入图片描述

/{folder} 路径

需要留意, 因为 S3 API 在访问不存在的桶时后端返回的响应状态码是 301 而不是 404, 所以这里我们需要匹配的目标状态码也得是 301. 具体步骤:

选中 /{folder} 资源下的 GET 方法, 切到 Method response 标签页, 点击 Create response, 创建状态码为 404 (这是我们要最终返回给浏览器的状态码), Content type = text/html 的响应

在这里插入图片描述

再切到 Integration response > Create response, 注意这里在 HTTP status regex 表达式中填入 301, 对应的 Method response status code 默认选择 404, Create.

在这里插入图片描述

创建完成后, 在当前页面翻动到底部编辑 404 - Response, Add mapping template, 和前面一样, Content type = text/html, Template body 填入自定义的 HTML 内容.

在这里插入图片描述

保存后 Deploy, 在浏览器中再访问一个不存在的桶, 符合预期.

https://abc12345.execute-api.cn-northwest-1.amazonaws.com.cn/dev/invalid-bucket

在这里插入图片描述

而继续测试正常存在的桶, 正常访问, 未受影响.

/{folder}/{item} 路径

和上面配置的无效桶的情况不一样的是, 当 S3 对象不存在, S3 后端会返回 404 状态码响应, 所以我们在配置 /{folder}/{item} 路径下 GET 方法时需要注意将 HTTP status regex 表达式中填入 404, 其余步骤均一样:

  • Method response 创建响应, 状态码 404, Response body > Content type = text/html
  • Integration response 创建响应, HTTP status regex = 404, Method response status code 默认 404
  • Integration response 编辑 404 - Response > Add mapping template, Content type = text/html, Template body 粘贴相同 HTML 代码
  • Deploy 后测试有效桶+无效对象 URL 访问, 正常得到自定义 404 页面内容.

后记

使用 API Gateway 时, 每次修改配置后务必记得 Deploy 才可生效. 另外, 上面的示例实现的是对 S3 存储桶中直接存放目标文件的访问, 如果桶中还有 “文件夹” (实质上是 Prefix), 需要访问位于文件夹内部的对象, 则需要在前面第一步配置 Resource 时将 {item} 资源的路径定义为 {item+}, 即贪婪模式, 这样才会将请求访问包含文件夹的目标对象完整信息(例如 folder/object.json) 传递给后端的 S3. 否则当 URL 参数中包含 / 符号时, 会被判定为要访问对应的 Resource 子路径, 由于实际上并不存在对应的配置, 会导致响应结果与预期不符.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于systemverilog中在task中使用force语句的注意事项

先看下面的代码 module top(data);logic clk; inout data; logic temp; logic sampale_data; logic [7:0] data_rec;task send_data(input [7:0] da);begin(posedge clk);#1;force datada[7];$display(data);(posedge clk);#1;force datada[6]; $display(data); (posed…

Python Day26 学习

继续NumPy的学习 数组的索引 一维数组的索引 创建及输出 arr1d np.arange(10) # 数组: [0 1 2 3 4 5 6 7 8 9] arr1d array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 取出数组的第一个元素,最后一个元素 代码实现 arr1d[0] arr1d[-1] 取出数组中索引为3&#x…

解决:npm install报错,reason: certificate has expired

目录 1. 问题分析2. 问题解决2.1 查看配置的镜像2.2 修改镜像源 种一棵树最好的时间是10年前,其次就是现在,加油! --by蜡笔小柯南 1. 问题分析 启动前…

中科固源Wisdom平台发现NASA核心飞行控制系统(cFS)通信协议健壮性缺陷!

中科固源Wisdom平台发现NASA核心飞行控制系统(cFS)通信协议健壮性缺陷,接下来内容将进行核心要点概述,分别从地位、重要性和应用场景三方面进行简明阐述: cFS(core Flight System)是NASA戈达德太空飞行中心&#xff08…

嵌入式学习笔记DAY23(树,哈希表)

一、树 1.树的概念 之前我们一直在谈的是一对一的线性结构,现实中,还存在很多一对多的情况需要处理,一对多的线性结构——树。 树的结点包括一个数据元素及若干指向其子树的分支,结点拥有的子树数称为结点的度。度为0的结点称为叶…

仓颉开发语言入门教程:搭建开发环境

仓颉开发语言作为华为为鸿蒙系统自研的开发语言,虽然才发布不久,但是它承担着极其重要的历史使命。作为鸿蒙开发者,掌握仓颉开发语言将成为不可或缺的技能,今天我们从零开始,为大家分享仓颉语言的开发教程,…

Axure中继器高保真交互原型的核心元件

Axure作为一款强大的原型设计工具,中继器无疑是打造高保真交互原型的核心利器。今天,就让我们深入探讨一下Axure中继器的核心地位、操作难点,以及如何借助优秀案例来提升我们的中继器使用技能。 一、核心地位 中继器在Axure中的地位举足轻重…

【SpringBoot】✈️整合飞书群机器人发送消息

💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时3分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&am…

第 1 章:数字 I/O 与串口通信(GPIO UART)

本章目标: 掌握 GPIO 的硬件原理、寄存器配置与典型驱动框架 深入理解 UART/USART 的帧格式、波特率配置、中断与 DMA 驱动 通过实战案例,将 GPIO 与 UART 结合,实现 AT 命令式外设控制 章节结构 GPIO 概述与硬件原理 GPIO 驱动实现:寄存器、中断与去抖 UART/USART 原理与帧…

【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型

Wan2.1:下一代开源大规模视频生成模型 引言Wan2.1 项目概述核心技术1. 3D 变分自编码器(Wan-VAE)2. 视频扩散 Transformer(Video Diffusion DiT)3. 数据处理与清洗 项目运行方式与执行步骤1. 环境准备2. 安装依赖3. 模…

interface接口和defer场景分析

接口 接口这里主要两点: 设计业务结构时采用依赖倒转:业务层向下依赖抽象层,实现层向上依赖抽象层。 相比于之前: 之后: 注意struct中嵌套interface和不嵌套interface的区别: type Myinterface interfac…

调用百度云API机器翻译

新建Python文件,叫 text_translator.py 输入 import requests import jsonAPI_KEY "glYiYVF2dSc7EQ8n78VDRCpa" # 替换为自己的API Key SECRET_KEY "kUlhze8OQZ7xbVRp" # 替换为自己的Secret Keydef main():# 选择翻译方向while True:di…

uni-app学习笔记六-vue3响应式基础

一.使用ref定义响应式变量 在组合式 API 中&#xff0c;推荐使用 ref() 函数来声明响应式状态&#xff0c;ref() 接收参数&#xff0c;并将其包裹在一个带有 .value 属性的 ref 对象中返回 示例代码&#xff1a; <template> <view>{{ num1 }}</view><vi…

『已解决』Python virtualenv_ error_ unrecognized arguments_--wheel-bundle

📣读完这篇文章里你能收获到 🐍 了解 virtualenv 参数错误的原因及解决方案📦 学习如何正确配置 Python 虚拟环境文章目录 前言一、问题描述1.1 错误现象1.2 影响范围二、问题分析2.1 根本原因三、解决方案3.1 兼容处理3.2 完整解决方案四、总结前言 本文详细介绍了在 D…

【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、InputSystem配置二、GameInput 游戏输入脚本1.实现思路2.完整代码三、Player 游戏人物移动脚本1.实现思路2.完整代码四、场景脚本设置1.组件设置五、问题解决1.人物一直下落2.人物跳跃时,…

单片机-STM32部分:13-1、编码器

飞书文档https://x509p6c8to.feishu.cn/wiki/BpEywhaX9iqbiLkdqdAcmDnwnab EC旋转编码器 在产品开发过程中&#xff0c;需要位置闭环的的产品&#xff0c;类似电机类产品来说&#xff0c;编码器至关重要&#xff0c;它不仅可以使我们对带年纪进行精确的速度闭环&#xff0c;位…

关于我在使用stream().toList()遇到的问题

关于我在使用stream().toList()遇到的问题 问题描述 在测试以上程序的时候抛出了空指针异常 于是我以为是我数据库中存在null字段&#xff0c;但查看后发现并不存在为null的数据 问题排查 起初我以为问题出现在sort排序方法这&#xff0c;事实也确实是&#xff0c;当我把s…

多卡跑ollama run deepseek-r1

# 设置环境变量并启动模型 export CUDA_VISIBLE_DEVICES0,1,2,3 export OLLAMA_SCHED_SPREAD1 # 启用多卡负载均衡 ollama run deepseek-r1:32b 若 deepseek-r1:32b 的显存需求未超过单卡容量&#xff08;如单卡 24GB&#xff09;&#xff0c;Ollama 不会自动启用多卡 在run…

基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例

前言 随着移动互联网的飞速发展&#xff0c;基于位置的服务&#xff08;LBS&#xff09;需求日益增长&#xff0c;越来越多的应用需要从地图中检索特定区域内的地理信息&#xff0c;例如商业场所、公共服务设施等。商场作为城市商业活动的重要载体&#xff0c;其周边的地理信息…

本地部署dify+ragflow+deepseek ,结合小模型实现故障预测,并结合本地知识库和大模型给出维修建议

1.准备工作 使用ollama 拉取deepseek-r1:7b 官网下载ollama ollama run deepseek-r1:7b ollama list Ragflow专注于构建基于检索增强生成&#xff08;RAG&#xff09;的工作流&#xff0c;强调模块化和轻量化&#xff0c;适合处理复杂文档格式和需要高精度检索的场景。Dify…