Appwrite函数无法通过context.req.body获取请求Payload问题
Appwrite函数无法捕获POST请求体的解决方案
问题根源
通过Appwrite函数执行API(/v1/functions/{id}/executions)调用函数时,请求体需要包裹在payload字段中,而非直接作为顶层JSON发送。同时Python函数中获取请求数据的方式也需要对应调整。
解决方案步骤
1. 修正请求发送格式
无论是Postman还是curl,都需要将业务数据嵌套进payload对象内:
curl示例:
curl --location 'https://XXXX.com/v1/functions/XXXX/executions' \ --header 'X-Appwrite-Project: XXXX' \ --header 'X-Appwrite-Key: XXXXX' \ --header 'Content-Type: application/json' \ --data '{ "payload": { "name": "John", "company": "XYZ Corp" } }'
Postman设置:
在请求体的Raw JSON中,将原数据放入payload字段:
{ "payload": { "name": "John", "company": "XYZ Corp" } }
2. 调整函数代码
Appwrite的Python runtime会自动解析payload字段为JSON对象,无需手动调用json.loads,同时修正代码中的其他问题:
import json import os from appwrite.client import Client from appwrite.services.databases import Databases from appwrite.id import ID def init_client(): client = Client() client.set_endpoint(os.environ['ENDPOINT_URL']) client.set_project(os.environ["APPWRITE_FUNCTION_PROJECT_ID"]) client.set_key(os.environ["APPWRITE_API_KEY"]) return client def add_to_collection(name, company): client = init_client() database = Databases(client) try: database.create_document( database_id="visitors", collection_id="qr-code-form", document_id=ID.unique(), data={ 'name': name, 'company': company } ) return "Document created" except Exception as e: context.error(f"Failed to create document: {str(e)}") return "Failed to create document" def main(context): # 直接使用已解析的payload,无需手动解析JSON data = context.req.payload # 校验参数是否存在 if not data or not data.get("name") or not data.get("company"): context.error({"success": False, "message": "name或company未提供"}) return context.res.empty() try: response = add_to_collection(data["name"], data["company"]) context.log({"success": True, "data": response}) return context.res.json({"success": True, "data": response}) except Exception as e: context.error({"success": False, "message": str(e)}) return context.res.empty()
关键修正点说明
- 使用
context.req.payload替代context.req.body:Appwrite会自动解析payload字段为JSON对象,避免手动解析错误。 - 修正异常处理:Python 3中
Exception对象无message属性,改用str(e)获取异常信息。 - 调整
add_to_collection返回逻辑:移除错误的context.response.send,直接返回字符串,由main函数统一处理响应。
内容的提问来源于stack exchange,提问作者Sven J
相关产品推荐
相关产品推荐

