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
相关产品推荐
相关产品推荐

