Windows 11下Git Bash执行cURL脚本400问题、CMD/PowerShell不能执行多行文本等问题记录及解决方案

问题

在Postman里可成功执行的POST请求:

找到Postman的Code

因为cURL基本上算是行业标准,所以Postman默认选中cURL,支持切换不同的开发语言:

点击上图右上角的复制按钮,得到cURL脚本。

Windows 11家庭版,打开Git Bash客户端,版本为:
git version 2.47.1.windows.1

执行上述cURL脚本异常:

报错信息:

json 复制代码
{"code":400,"msg":"JSON parse error: Invalid UTF-8 start byte 0xb4; nested exception is com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xb4\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 3, column: 18]"}

分析

根据上面几行简短的报错信息,提取几个关键内容:

  • code=400:表明这是客户端异常,此处的客户端是Git Bash;
  • JsonParseException和StreamUtils:表明服务端确实有接收到客户端提交的请求,要不然客户端也无法得知Jackson框架里的类JsonParseException,当然也无法得知Spring框架里的StreamUtils工具类;
  • 报错原因是非法JSON:JSON parse error
  • 编码异常:Invalid UTF-8 start byte 0xb4

分析起来,看起来头头是道,怎么解决问题呢?

排查

遇到问题时,还是习惯性将问题抛给ChatGPT,结果这次是真的全程被ChatGPT的胡言乱语给糊弄,浪费不少时间。

一一尝试:

  • 很明确是小写双引号,不是大写双引号;
  • 将上述cURL脚本使用txt文件保存,并保存为不带BOM的格式,没有解决问题;
  • 报错提示是第三行line: 3, column: 18,好像是min_score字段,去掉引号试试,还是报错:
  • --data-binary还是报错:

方法一

反复尝试+试错,浪费不少时间,ChatGPT终于给出一个可行的解决方案:

也就是在Git Bash执行的目录下,新增一个payload.json文件,内容就是POST请求的requestBody:

json 复制代码
{
    "retriever_type": "TEXT",
    "question": "大模型技术如何帮助数据中心实现高效减碳?",
    "min_score": "0.2",
    "max_results": "10"
}

然后将命令:

shell 复制代码
--data '{
    "retriever_type": "TEXT",
    "question": "大模型技术如何帮助数据中心实现高效减碳?",
    "min_score": "0.2",
    "max_results": "10"
}'

修改为(其他部分不变):--data @payload.json

执行效果:

方法二

为了执行一个在Postman可以成功执行的cURL脚本,我需要另存为一个JSON文件,感觉非常反人类。于是继续追问ChatGPT,给出一个不使用文件的方法:

shell 复制代码
printf '%s' '{
  "retriever_type": "TEXT",
  "question": "大模型技术如何帮助数据中心实现高效减碳?",
  "min_score": "0.2",
  "max_results": "10"
}' | curl --location 'http://api.test.tesla.com/rag_online/rag/retrieval' \
  --header 'tesla-token: 1111222233334444' \
  --header 'Content-Type: application/json' \
  --data @-

和上面的解决方法非常类似。

GET

Git Bash客户端下执行cURL GET命令没有问题,只是在执行POST命令才有问题。

CMD/PowerShell

既然Git Bash客户端不能用,于是将注意力放在其他客户端。

打开cmd或PowerShell,粘帖cURL脚本,结果给我提示:您将粘贴包含多行的文本。如果将此文本粘贴到 shell 中,则可能会导致命令意外执行。是否继续?

如上图所示,CMD和PowerShell无法识别多行cURL脚本,会拆分成多行,当然会执行失败。

怎么解决?

ChatGPT又让我失望

并不能解决问题。

Google找到一篇类似的报错Jackson JSON parser invalid utf-8 start byte

TODO:未解决。

Mac

上述cURL脚本在同事的Mac开发机上(使用的终端未知),可执行成功。

解决方案

Git Bash

如果是GET请求,直接可使用Git Bash。但是对于POST请求,如果坚持要使用Git Bash客户端,有两种方法:

  • 使用文件
shell 复制代码
curl --location 'http://api.test.tesla.com/rag_online/rag/retrieval' \
--header 'tesla-token: 1111222233334444' \
--header 'Content-Type: application/json' \
--data @payload.json
  • 使用管道符
shell 复制代码
printf '%s' '{
  "retriever_type": "TEXT",
  "question": "大模型技术如何帮助数据中心实现高效减碳?",
  "min_score": "0.2",
  "max_results": "10"
}' | curl --location 'http://api.test.tesla.com/rag_online/rag/retrieval' \
  --header 'ecmas-token: 1111222233334444' \
  --header 'Content-Type: application/json' \
  --data @-

Mac

Mac比Windows强,受开发者青睐,不是没有原因的。

WSL

Windows 8不知道什么时候开始支持WSL,另外貌似有不少问题,Windows 10/11好像也不是一开始就支持WSL的。

总而言之,如果可以的话,建议升级Windows版本,安装WSL,比CMD、PowerShell功能强大:

使用WSL可执行多行cURL脚本。当然,WSL是一个Ubuntu系统,默认自带cURL命令。

关于WSL,参考我写的另一篇Windows 10/11安装使用WSL

参考

  • ChatGPT
相关推荐
武藤一雄8 小时前
C# 关于多线程如何实现需要注意的问题(持续更新)
windows·后端·microsoft·c#·.net·.netcore·死锁
ASEpochs11 小时前
Vsocde中‘sh’不是内部或外部命令,也不是可运行的程序或批量处理文件--已解决
git·vscode·bash
coding消烦员11 小时前
在 Windows 内网搭建 Git 仓库:共享普通仓库 vs 中心 bare 仓库
windows·git
xiaoliuliu1234516 小时前
IE8-WindowsXP-x86-CHS_23253_BDdl.exe 安装步骤(XP 32位简体中文版)
windows
百事牛科技16 小时前
文件不想再加密了?取消Word 打开密码的方法
windows·word
love530love17 小时前
EPGF 新手教程 13在 PyCharm(中文版 GUI)中创建 Hatch 项目环境,并把 Hatch 做成“项目自包含”(工具本地化为必做环节)
开发语言·ide·人工智能·windows·python·pycharm·hatch
峰上踏雪18 小时前
Go(Golang)Windows 环境配置关键点总结
开发语言·windows·golang·go语言
lusasky18 小时前
在Windows上编译、安装Rust
开发语言·windows·rust
麻辣长颈鹿Sir19 小时前
CMAKE指令集
linux·运维·windows·cmake·cmake指令集
Alice102919 小时前
如何在windows本地打包python镜像
开发语言·windows·python