使用 curl 调用已部署 MLflow 模型时 Content-Type 被识别错误
问题原因
该问题基本都出在Windows终端环境,由两个原因共同导致:
- PowerShell默认给
curl配置了Invoke-WebRequest的命令别名,这个别名指向的是PowerShell原生cmdlet,并非真正的cURL工具。输入的-d、-H等cURL风格参数不会按cURL规则解析,POST请求默认使用application/x-www-form-urlencoded作为Content-Type,自定义请求头并未正确传递给MLflow服务。 - 类Unix Shell(Bash/Zsh等)支持单引号包裹字符串,但Windows PowerShell、CMD均不认可单引号作为JSON体的边界符号,会造成JSON参数解析错误。
解决方法
根据当前使用的终端选择对应命令即可:
PowerShell环境
方式一:显式调用真实cURL
Win10 1809及以上版本系统自带真实cURL,添加.exe后缀可绕过别名优先级,直接调用官方cURL程序:
curl.exe -d '{\"columns\":[\"x\"], \"data\":[[1], [-1]]}' -H "Content-Type: application/json; format=pandas-split" -X POST http://localhost:5000/invocations
可执行Get-Command curl验证当前命中的程序:若返回结果的CommandType属性为Alias,说明命中的是内置别名。
方式二:使用PowerShell原生命令
无需依赖cURL,直接用PowerShell原生的Invoke-RestMethod构造请求,语法适配性更好:
$body = @{ columns = @("x") data = @(@(1), @(-1)) } | ConvertTo-Json Invoke-RestMethod -Uri "http://localhost:5000/invocations" ` -Method Post ` -Body $body ` -ContentType "application/json; format=pandas-split"
Windows CMD环境
CMD不支持单引号语法,JSON外层使用双引号,内部双引号用反斜杠转义:
curl -d "{\"columns\":[\"x\"], \"data\":[[1], [-1]]}" -H "Content-Type: application/json; format=pandas-split" -X POST http://localhost:5000/invocations
类Unix终端(Bash/Zsh/WSL/Git Bash)
该环境的单引号语法与cURL原生要求一致,补全请求地址的http://前缀即可正常执行:
curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST http://localhost:5000/invocations
内容的提问来源于stack exchange,提问作者kaiwen shen
相关产品推荐
相关产品推荐

