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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:42:43