问题场景
在Linux环境使用 curl
命令发送带 多个参数
的Get请求,请求返回提示appid参数丢失
curl https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xx
解决方法
- 在参数拼接符
&
前面加反斜杠
curl https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential
&appid=xxx
&secret=xx
- 请求地址使用单引号包裹住,让系统认定这一个字符串是curl命令的单独一个参数,防止其他符号或关键字让系统认为这是在系统层面的参数导致请求参数丢失(建议)
curl
'
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xx'
原因解析
-
一开始在网上看到一个说法:在linux中使用
&
会使进程后台运行,必须对&
进行转义。后咨询Linux巨佬得知&
是Linux的后台运行指令,单独的空格+&
会被系统识别成后台运行,但是需要在&前面有空格,后面没其他字符才会被认为要后台运行,跟目前情况不符,所以这种解释说不通 -
Linux巨佬建议Linux下的
curl
整个请求地址用单引号包起来,不用引号的话请求拼接的参数Linux会以为是系统shell层面的参数,而不是传给curl内部的参数。
系统层面本来就支持一些参数,在输入命令时有空格+关键字
就会被识别成参数,运行一些应用的时候,这些应用本身也支持输入参数,就好像curl 请求地址
,请求地址就是curl
的参数。
这个时候如果不是以字符串形式输入,系统会以为有些关键字是在系统层面的参数,使用字符串形式或者用字符串拼接就是把这个当做一个整体参数来看待了,这样也能减少系统识别出错(建议用单引号包裹解决方式的原因)
另外,curl后面的最好用单引号,不用双引号。双引号里面不支持直接拼接变量形式的参数,如-H 'User-Agent: '$UA
,这个就是单引号包着,后面可以直接拼接变量参数UA,$
是告诉系统UA是个变量。