问题
之前都是使用 postman 或 Apifox 测试接口,或者在 Linux 上使用 curl
命令测试接口,偶然在 windows 电脑上使用了 curl 命令测试接口,竟然报错 curl: (3) unmatched close brace/bracket in URL position x
,如下图所示:
一开始以为参数使用不当,后来反复对比下方的 curl
标准用法,并没有什么区别。
curl -X POST \-H "Content-Type: application/json" \-d '{"key": "value"}' \http://example.com/api/data
解释
-X POST
: 指定请求方法为 POST。-H "Content-Type: application/json"
: 设置请求头中的 Content-Type 为 application/json,这告诉服务器请求体中的数据是 JSON 格式。-d '{"key": "value"}'
: 设置请求体数据为 JSON 字符串 { “key”: “value” }。
使用 --data-raw 或 -d
如果 JSON 数据中包含特殊字符,可能需要使用 --data-raw
或 -d
选项来避免对数据进行 URL 编码,这是不必要的。
原因
查询一番后,发现在 Windows 的命令行(cmd),curl
命令的语法与 Linux/Unix 稍有不同,主要表现在对引号的处理上。Windows 命令行不支持单引号作为字符串的定界符,需要使用双引号代替。
例如,如果在 Linux 上使用如下的 curl
命令:
curl -X POST -H 'Content-Type: application/json' -d '{"key1":"value1", "key2":"value2"}' http://example.com/api
解决办法1
在 Windows 上,则需要将单引号换成双引号,Windows 中的双引号包裹的字符串如果本身包含双引号(如 JSON 中的键值对),则这些内嵌的双引号需要进行转义,使用反斜杠 \
进行转义。
curl -X POST -H "Content-Type: application/json" -d "{\"key1\":\"value1\", \"key2\":\"value2\"}" http://example.com/api
解决办法2
使用 Gitbash,支持 linux 命令语法:
解决办法3
使用文件存储 json 数据,将 a
存入add-field.txt
,在文件所在目录执行下列命令:
curl -X POST -H "Content-Type: application/json" --data-binary @add-field.txt http://localhost:5000/process_data
如果还有更好的方法,欢迎留言讨论~