You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda Chalice部署后无法接收请求负载问题排查

问题根源与解决方案

核心问题

你遇到的KeyError: 'data'是因为HTTP规范中GET请求不应携带请求体,虽然本地Chalice开发服务器允许这种不规范的请求,但AWS API Gateway会严格遵循HTTP规范,直接丢弃GET请求的body,导致后端代码中app.current_request.raw_body为空,parse_qs(body)返回空字典,自然无法取出'data'键。

修复步骤

1. 修改后端路由为POST请求

POST请求专门用于提交数据,API Gateway会正确处理其请求体。更新app.py的路由配置和请求体解析逻辑:

# other imports
from urllib import parse_qs
import base64
import pickle

def encode_payload(payload):
    '''encodes generic payload'''
    return base64.b64encode(pickle.dumps(payload)).decode('utf-8')

def decode_payload(payload):
    '''decodes generic payload'''
    return pickle.loads(base64.b64decode(payload))

app = Chalice(app_name='markthis-api')

@app.route('/questions', methods=['POST'], content_types=['application/json'])
def questions():
    style = app.current_request.query_params['style']
    # 直接从JSON请求体中获取data,无需手动解析表单格式
    payload = app.current_request.json_body['data']
    img = decode_payload(payload)

    stuff = find_questions(img, style)

    return {'pickle': encode_payload(stuff)}

2. 修改客户端请求为POST并传递JSON数据

更新test.py中的请求逻辑,使用POST请求并传递JSON格式的 payload(requests.post的json参数会自动设置正确的Content-Type: application/json头):

import requests

def api_request(img, style):
    url = f'https://api-code-etc.execute-api.eu-west-2.amazonaws.com/api/questions?style={style}'
    #url = f'http://localhost:8000/questions?style={style}'

    payload = {'data': encode_payload(img)}

    # 使用POST请求,通过json参数传递数据
    return requests.post(url, json=payload)

为什么本地测试正常?

Chalice的本地开发服务器为了方便调试,对HTTP规范的兼容性更宽松,允许GET请求携带请求体;但部署到AWS后,API Gateway严格执行HTTP标准,不处理GET请求的body,这才导致了本地与生产环境的行为差异。

额外注意事项

如果坚持使用GET请求,只能将data参数放到URL查询字符串中,但由于你的data是base64编码的图片数据,长度可能超过URL的最大限制(通常是2KB左右),因此强烈推荐使用POST方案。

内容的提问来源于stack exchange,提问作者Sefton de Pledge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:20:59