当使用cURL通过POST发送数据时,如果该数据字符串是URL编码的,或者部分数据是URL编码的,则cURL会在发送数据时自动对数据进行解码。
在PHP中使用cURL或直接在命令行中使用时会发生这种情况。
我已经使用2种不同版本的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数据转储到磁盘上的文件来检索数据。
这是正常的吗?知道是什么原因引起的吗?
答案 0 :(得分:2)
这里有两个不同的断言:
cURL会在发送数据时自动解码数据。
...
我只是在检索后将POST数据转储到文件中。
当接收时,PHP会自动解码数据。它不会在发送后解码!
这与其他值的行为集成在一起,比如cookie数据,post和get变量,头文件信息,例如referrer,......收到后会自动解码所有内容,因为预计会发送编码。
如果要查看通过线路发送的确切数据,请在端口80上使用ngrep
之类的工具来嗅探TCP HTTP流量。