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

Azure函数部署后CosmosDB触发函数无法正确传递请求体至HTTP触发函数

问题原因与解决方法

核心问题分析

你遇到的问题根源在于双重JSON序列化,加上HTTP触发函数对请求体的错误解析逻辑——本地环境的宽松容错掩盖了问题,但部署到Azure后严格的处理逻辑暴露了错误:

  1. CosmosDB触发函数的错误:你先用json.dumps(document)把字典转成JSON字符串,调用requests.request时又用了json=json_data参数,这个参数会自动把传入对象序列化成JSON,相当于对已序列化的字符串再做一次序列化,最终传到HTTP函数的是类似"{\"key\":\"value\"}"的嵌套字符串,而非正常JSON对象。
  2. HTTP触发函数的错误:req.get_json()已经是Azure SDK帮你解析好的Python字典/列表,你再用json.loads()解析这个对象会抛出TypeError,但代码只捕获了OSError,导致异常未被处理,表现为请求体传递失败。

修正代码

1. 修正CosmosDB触发函数

直接传递原始字典给json参数,无需手动序列化:

def post_document(document: dict):
    logger.info(f"posting document: {document}")
    headers = {
        'Content-Type': 'application/json'
    }
    # 直接传document字典,requests会自动完成序列化
    response = requests.request("POST", URL, headers=headers, json=document, timeout=10)
    assert response.status_code == 200, f'ER POST failed {response.content}'

    logger.info(f'ER POST request successful')

2. 修正HTTP触发函数

去掉多余的json.loads(),同时补充捕获解析类异常:

try:
    # req.get_json()已经是解析好的Python对象,无需再次反序列化
    req_body = req.get_json()
    logger.info(req_body)
    run_process(req_body)
    return func.HttpResponse(status_code=200)
except (OSError, TypeError, ValueError) as exception:
    logger.error(f"An error occurred while processing the request: {exception}")
    return func.HttpResponse(str(exception), status_code=400)

额外建议

  • 部署后查看Azure函数的控制台日志或Application Insights日志,能直接看到未被捕获的异常信息,快速定位问题;
  • 硬编码时你传递的是正常字典对象,没有双重序列化问题,这也是硬编码能正常运行的原因。

内容的提问来源于stack exchange,提问作者nullnameguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:13:26