如何对curl命令的数据进行url编码

2024-01-11 14:05:37 浏览数 (2)

问:

我正在尝试编写一个用于测试的 bash 脚本,该脚本接受一个参数并通过 curl 将其发送到网站。我需要对值进行 url 编码,以确保特殊字符得到正确处理。最好的方法是什么?

这是我到目前为止的基本脚本:

代码语言:javascript复制
#!/bin/bash
host=${1:?'bad host'}
value=$2
shift
shift
curl -v -d "param=${value}" http://${host}/somepath $@

答:

使用 curl --data-urlencode ;curl 的手册写到:

This posts data, similar to the other --data options with the exception that this performs URL-encoding. To be CGI-compliant, the <data> part should begin with a name followed by a separator and a content specification.

示例用法

代码语言:javascript复制
curl 
    --data-urlencode "paramName=value" 
    --data-urlencode "secondParam=value2" 
    http://example.com

这需要 curl 7.18.0 或更新版本。使用 curl -V 来检查你的版本。

提问者的脚本可以改写为

代码语言:javascript复制
#!/bin/bash

host=${1:?'bad host'}
value=$2
shift
shift
curl -v --data-urlencode "param=${value}" http://${host}/somepath $@

将脚本保存为 curl-test.sh 文件,在一个窗口使用 tcpdump 对上网的网口开启过滤抓包,在另一个窗口执行命令 bash curl-test.sh example.com "ABC efg" 进行测试,抓包截图如下:

可以发现参数 "ABC efg" 被编码成为 ABC efg,即字符空格被编码为 。

类似地,# $ : ; , ?等特殊字符都有其对应的 URL 编码。


参考文档:

  • stackoverflow question 296536
  • https://manpages.org/curl

0 人点赞