Azure函数部署后CosmosDB触发函数无法正确传递请求体至HTTP触发函数
问题原因与解决方法
核心问题分析
你遇到的问题根源在于双重JSON序列化,加上HTTP触发函数对请求体的错误解析逻辑——本地环境的宽松容错掩盖了问题,但部署到Azure后严格的处理逻辑暴露了错误:
- CosmosDB触发函数的错误:你先用
json.dumps(document)把字典转成JSON字符串,调用requests.request时又用了json=json_data参数,这个参数会自动把传入对象序列化成JSON,相当于对已序列化的字符串再做一次序列化,最终传到HTTP函数的是类似"{\"key\":\"value\"}"的嵌套字符串,而非正常JSON对象。 - 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
相关产品推荐
相关产品推荐

