Re: PHP cURL实现模拟登录与采集使用方法详解教程
发送json数据,在控制台中的表现主要如图(七)所示:
ajax发送json的控制台信息
第一条发送的是json格式的数据,
第二条发送的是以\n分割的数据,
第三条发送的是以&分割的数据。
这个在ajax请求的时候,只需要添加contentType参数即可,如:
[code] var data = ["name:Zjmainstay", "website:http://www.zjmainstay.cn"];
$.ajax({
url: 'http://test.com/curl/testPostJsonData.php',
type: 'post',
data: data.join("\n"),
contentType: 'text/plain',
success: function(result) {
console.log(result);
},
error: function(msg) {
console.log(msg);
}
});
[/code]
对于这类发送json数据的请求,复制cURL命令时,你会发现其中根本没有发送数据,如:
[code] curl 'http://test.com/curl/testPostJsonData.php' -X POST -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' -H 'Cache-Control: max-age=0' -H 'Connection: keep-alive' -H 'Content-Length: 48' -H 'Content-Type: text/plain' -H 'Cookie: __utma=99889051.942646074.1467634856.1467634856.1467636947.2' -H 'Host: test.com' -H 'Referer: http://test.com/curl/ajaxJsonData.html' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:47.0) Gecko/20100101 Firefox/47.0' -H 'X-Requested-With: XMLHttpRequest'[/code]
对于这种数据,我们要用PHP cURL模拟发送的话,需要发送相应的header参数,示例:
[code] #json数据
$url = 'http://test.com/curl/testPostJsonData.php';
$data = '{"a":"b"}';
$length = strlen($data);
$header = array(
'Content-Length: ' . $length, //不是必需的
'Content-Type: text/json',
);
$ch = curl_init($url); //初始化curl
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$content = curl_exec($ch); //执行并存储结果
curl_close($ch);
echo $content;
#\n分割数据
$data = [
'name:Zjmainstay',
'website:http://www.zjmainstay.cn',
];
$data = implode("\n", $data);
#&分割数据
$data = 'name:Zjmainstay&website:http://www.zjmainstay.cn';[/code]
对于$.ajax我们常常会使用这种写法来指定返回json格式数据:
[code] $.ajax({
url: url,
dataType: 'json',
...
});[/code]
我们会发现,cURL请求头Accept:部分会多出一些参数:
[code] -H 'Accept: application/json, text/javascript, */*; q=0.01'[/code]
因此,如果需要指定返回内容作为json格式,我们就需要指定application/json格式。
那么,对于这种给服务器端发送json数据的程序,服务器端是怎么得到请求数据的呢?
如果你们做过尝试,一定会发现此时$_POST是空的,我们要使用php://input进行数据获取,示例:
[code] $postData = file_get_contents('php://input');[/code]