为什么cURL在发布时解码我的URL编码值


Why is cURL decoding my URL encoded values when POSTing?

当使用cURL通过POST发送数据时,如果该数据字符串是URL编码的,或者它的一部分是URL编码的,cURL在发送时自动解码数据

当在PHP中使用cURL或直接在命令行中使用cURL时会发生这种情况。

我测试了两个不同版本的cURL: 7.19和7.49。两者表现出相同的行为

我从两个不同的服务器发送cURL请求,认为服务器的配置方式会影响这个,但结果是一样的。

下面是我在测试中使用的一个简单的PHP cURL请求:
$ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13';
$data = "https%3A%2F%2Fexample.com%3A8081%2Ftemoignez%3FQid%3D%26"       
$ch = curl_init( "https://example.com/test/webhook.php" );
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "payload=".$data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );

即使初始字符串是URL编码,数据也将被解码发送。

我通过使用PHP将POST数据转储到磁盘上的文件来检索数据。

这正常吗?知道是什么原因引起的吗?

这里有两个不同的断言:

cURL在发送时自动解码数据

我只是在检索POST数据后将其转储到文件中。

接收到数据时,PHP会自动解码数据。当发送时,它没有被解码!

这与其他值的行为集成,如cookie数据,post和get变量,报头信息,如referrer,…接收到的所有get都会自动解码,因为它被期望以编码的方式发送。

当您想要查看通过网络发送的确切数据时,可以使用端口80上的ngrep之类的工具来嗅探TCP HTTP流量。