AWS Lambda+API Gateway返回Shift_JIS编码CSV的问题求助
解决AWS Lambda + API Gateway返回Shift_JIS编码CSV的问题
核心方案
API Gateway默认仅处理UTF-8文本响应,但通过Lambda返回base64编码的二进制数据+API Gateway自动解码的方式,客户端可直接拿到Shift_JIS编码的CSV,无需额外解码操作——网关会帮你完成这一步,并非需要客户端处理base64。
1. 调整Lambda函数代码
将Shift_JIS编码后的字节数据做base64编码,同时在返回对象中指定isBase64Encoded: true和正确响应头:
import codecs import base64 def lambda_handler(event, context): # 从请求中获取输入文本,这里用示例值 input_string = event.get('body', '武蔵野冷蔵名古屋') # 转换为Shift_JIS字节流 shift_jis_bytes = codecs.encode(input_string, 'SHIFT_JIS', errors='ignore') # base64编码(供API Gateway解析用) base64_body = base64.b64encode(shift_jis_bytes).decode('utf-8') return { 'statusCode': 200, 'headers': { 'Content-Type': 'text/csv; charset=Shift_JIS', # 可选:添加该头让浏览器直接下载文件 'Content-Disposition': 'attachment; filename=output.csv' }, 'isBase64Encoded': True, 'body': base64_body }
2. REST API配置(必须步骤)
若使用REST API,需配置二进制媒体类型并重新部署:
- 打开API Gateway控制台,进入目标API
- 切换到Settings标签页,在Binary Media Types中添加
text/csv(或更精确的text/csv; charset=Shift_JIS) - 点击Deploy API,选择对应部署阶段生效
3. HTTP API配置
若使用HTTP API,无需额外配置二进制媒体类型,只要Lambda返回格式正确(isBase64Encoded: true+正确Content-Type),网关会自动处理二进制响应。
之前配置无效的常见原因
- 未重新部署API:所有API Gateway配置变更必须重新部署才会生效,这是最容易忽略的点
- Binary Media Types不匹配:比如设置了
application/csv,但Lambda返回的Content-Type是text/csv,导致网关无法识别二进制响应 - Lambda返回格式错误:未设置
isBase64Encoded: True,或body不是base64编码的字符串(比如直接返回字节数据)
验证方法
用curl测试接口,查看响应头和内容:
curl -i https://<你的API ID>.execute-api.<区域>.amazonaws.com/<阶段>/<端点>
你会看到响应头包含Content-Type: text/csv; charset=Shift_JIS,且响应内容是Shift_JIS编码的原始文本,客户端可直接保存为CSV文件使用。
内容的提问来源于stack exchange,提问作者Tan Ho
相关产品推荐
相关产品推荐

