添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
curl发送请求时如何才能不用操心参数转义

curl发送请求时如何才能不用操心参数转义

问题

使用命令行工具的时候,经常会遇到参数转义的问题。在使用curl发送http请求的时候,这个问题尤其明显,因为http请求经常包含大段数据做参数,难免会出现在shell中有特殊含义的字符。

比如下面的例子中,要发送一段json数据,因为数据中的引号和外层界定参数的引号有冲突,就不得不对数据中的引号做转义。这样看起来非常难看:

curl "http://postman-echo.com/post" --json "{\"key\": \"value\"}"

解决方案

方法1

为了避免转义,一个办法就是外层用单引号做参数界定:

curl "http://postman-echo.com/post" --json  '{"key": "value"}'

但是这样并不能完全解决问题,当数据中也包含单引号的时候,这个问题将变得更加复杂,因为shell中单引号的转义语法要更加麻烦。当有单引号的时候,你可能得这么写:

curl "https://postman-echo.com/post" --json '{"key": "I'\''m value"}'

方法2

对于复杂的参数,我们可以先将参数保存到一个文件中,然后可以在参数中引用文件路径:

# 假设我们先把上面的json数据保存到了json.txt文件中
curl "https://postman-echo.com/post" --json @json.txt

这种方法的缺点是,你不得不将先建立一个临时文件,对于习惯好的小伙伴来说,发送完请求你还得记得删除掉这个临时文件,要不然用不了多长时间磁盘上就会堆满各种奇奇怪怪的临时文件。

另一个缺点,就是这中'@<文件路径>'的传参方法是curl特有的,换成其他命令就行不通了。

方法3(推荐)

在这里,我们隆重介绍本文重点推荐的方法,有诸多好处:

  • 可以避免各种转义
  • 可以避免引入临时文件
  • 不依赖curl特有的语法,可以在所有命令中使用
curl "https://postman-echo.com/post" --json "$(cat << EOF
{"key": "I'm value"}
)"

这个命令看起来很复杂,但其实拆解开来很好理解,并且输入起来也不复杂。

  1. $(<cmd>) 这种写法,表示将 <cmd> 这个命令的标准输出收集起来作为一个字符串,一次上面就是把 cat ... 这个命令的输出作为字符串传递给 --json 这个参数。
  2. cat << EOF ... EOF 这种写法,在shell中叫HERE DOCUMENT。它的作用就是把第一个EOF后面,第二个EOF前面的文本,作为cat命令的标准输入。我们知道,cat命令是个吃啥拉啥的家伙。它会把从自己标准输出获得的数据原封不动的发送到自己的标准输出。结合上面第一条,这个标准输出又会被收集成一个字符串。因此最终的效果就是两个EOF之间的内容作为 --json 参数的值。只不过在HERE DOCUMENT里,你不需要考虑各种字符的转义了。
发布于 2024-01-10 09:13 ・IP 属地陕西