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

Python调用Databricks REST API遇400错误?MLflow实验接口问题排查

问题描述

我想用Python上传和下载Databricks中保存的MLflow实验。已经通过以下代码成功连接并调用接口:

dbk_host = 'https://adb-xxxxxxxxxxxxxxxxxxxxxxxxx.clooud.databricks.com'
api_version = '/api/2.0'
api_command = '/jobs/runs/list'
 
url = f"{dbk_host}{api_version}{api_command}"
DBRKS_REQ_HEADERS = {'Authorization': 'Bearer ' + DBRKS_BEARER_TOKEN  }

response = requests.get(url = url, headers=DBRKS_REQ_HEADERS, params={'limit': 25, 'offset': 0})

但切换到调用MLflow接口时出现400 Client Error:

dbk_host = 'https://adb-xxxxxxxxxxxxxxxxxxxxxxxxx.clooud.databricks.com'
api_version = '/api/2.0'
api_command = '/mlflow/experiments/get-by-name'
 
url = f"{dbk_host}{api_version}{api_command}"
DBRKS_REQ_HEADERS = {'Authorization': 'Bearer ' + DBRKS_BEARER_TOKEN  }
DBRKS_REQ_DATA = {"experiment_name": "mlflow-model-registry-example"}

response = requests.get(url = url, data=DBRKS_REQ_DATA, headers=DBRKS_REQ_HEADERS)

请问是否是因为缺少params参数导致的?该如何解决此问题?更通用地说,应如何配置连接以正常调用各类REST API?

问题解答

1. 400错误的直接原因

不是缺少params参数,而是请求方法和参数传递方式错误:

  • Databricks上的/mlflow/experiments/get-by-name接口要求用GET请求,但参数需通过URL的params传递,而非data字段(data通常用于POST请求的表单数据)。
  • 你当前用GET请求却把参数放在data里,服务端无法解析,所以返回400错误。

2. 修复后的代码

将参数移到params中即可:

dbk_host = 'https://adb-xxxxxxxxxxxxxxxxxxxxxxxxx.clooud.databricks.com'
api_version = '/api/2.0'
api_command = '/mlflow/experiments/get-by-name'
 
url = f"{dbk_host}{api_version}{api_command}"
DBRKS_REQ_HEADERS = {'Authorization': 'Bearer ' + DBRKS_BEARER_TOKEN  }
# 将参数放入params
response = requests.get(url = url, params={"experiment_name": "mlflow-model-registry-example"}, headers=DBRKS_REQ_HEADERS)

3. 通用REST API调用配置要点

  • 确认请求方法:先查Databricks官方API文档,明确接口是GET/POST/PUT等,比如MLflow的部分创建类接口需要用POST,且参数要以JSON格式放在请求体中。
  • 参数传递方式:
    • GET请求:参数通过params字典传递,会自动拼接到URL后。
    • POST/PUT请求:如果要求JSON格式,需用json参数传递字典,同时确保请求头包含Content-Type: application/json(使用requests的json参数时会自动添加该头)。
  • 统一连接配置:可以封装一个工具函数,减少重复代码:
import requests

def call_databricks_api(host, api_version, command, method="GET", params=None, json_body=None):
    url = f"{host}{api_version}{command}"
    headers = {'Authorization': 'Bearer ' + DBRKS_BEARER_TOKEN}
    if method.upper() == "GET":
        return requests.get(url, headers=headers, params=params or {})
    elif method.upper() == "POST":
        return requests.post(url, headers=headers, json=json_body or {})
    # 可扩展PUT、DELETE等其他请求方法
  • 错误排查:遇到400/401等错误时,先打印response.text查看服务端返回的具体错误信息,比单纯看状态码更有助于定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:07:47