Azure Function App(Python)解析POST请求JSON字符串报错排查
问题原因与解决方法
错误根源
核心错误是错误转换字节对象为字符串:
req.get_body()返回的是字节对象(如b'{"name":"Azure"}'),直接用str()转换会得到带b'...'前缀的字符串,实际内容为"b'{\"name\":\"Azure\"}'",这并非合法JSON格式,导致json.loads抛出解码错误。
两种修复方案
方案1:使用HttpRequest内置的get_json()方法(推荐)
Azure Functions的HttpRequest对象已封装JSON解析的便捷方法,无需手动处理字节转码:
import azure.functions as func import logging import json app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) @app.route(route="functionAppTest",methods=[func.HttpMethod.POST]) def functionAppTest(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') try: req_body = req.get_json() logging.info(f"Parsed JSON: {req_body}") # 返回JSON格式响应,200表示请求处理成功 return func.HttpResponse( json.dumps(req_body.values()), mimetype="application/json", status_code=200 ) except ValueError: # JSON解析失败时返回错误提示 return func.HttpResponse( "Invalid JSON request body", status_code=400 )
方案2:手动解码字节对象
若需手动处理请求体,用decode('utf-8')将字节对象转成正确的UTF-8字符串:
import azure.functions as func import logging import json app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) @app.route(route="functionAppTest",methods=[func.HttpMethod.POST]) def functionAppTest(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') res_b = req.get_body().decode('utf-8') # 正确解码字节为字符串 logging.info(f"Request Body: {res_b}") if res_b: try: parsed_json = json.loads(res_b) logging.info(f"Parsed JSON: {parsed_json}") return func.HttpResponse( json.dumps(parsed_json.values()), mimetype="application/json", status_code=200 ) except json.JSONDecodeError: return func.HttpResponse( "Failed to parse JSON", status_code=400 ) else: return func.HttpResponse("Empty request body", status_code=400)
额外注意点
- 原代码直接返回
json.loads(res_b).values()会导致响应格式异常,需用json.dumps()转成JSON字符串,并设置mimetype="application/json"。 - 状态码400表示客户端错误,解析成功时应使用200表示请求正常处理。
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

