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
相关产品推荐
相关产品推荐

