php使用curl发送get和post请求,可以设置header信息,保持会话状态

来源:赵克立 分类: PHP 标签:PHP函数发布时间:2016-11-09 12:10:51浏览:76
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
温馨提示:
技术类文章有它的时效性,请留意文章更新时间以及软件的版本
更新时间:
2017-08-12 09:05:03

使用php请求网页内容的方法有很多,

下面只写常见的几种,省得有选择困难症的时候,一直在考虑用哪个合适,以至于耽误时间,下面几种使用方法都是一样的

第一种

下面函数post提交方式为下面的方式,为什么要提醒这个呢,原因看后面就知道啦,本人就掉到这个坑里一次,一直收不到数据 

Content-Type: application/x-www-form-urlencoded
/**
 * opt请求数组数据
 * @param  [type] $url       url地址
 * @param  [type] $postData post的数据数组key=>value对,如果此项有数据自动转换为post请求
 * @param  [type] $headers  请求头信息为一维数组
 * @return [type]           返回网页内容
 */
function send_request($opt) {
	$conf = [
		'url'      => '',
		'postdata' => [], //有数据时自动转为post
		'headers'  => [],
		'post'     => false, //默认为false,true时当前请求强制转为post
	];
	$conf = array_merge($conf, $opt);
	if (is_string($conf['headers'])) {
		$conf['headers'] = trim($conf['headers']);
		$conf['headers'] = preg_split('/\r?\n/', $conf['headers']);
	}
	if (!$conf['url']) {
		return '';
	}
	// var_dump($conf['postdata']);
	// var_dump($conf['headers']);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $conf['url']);
	if ($conf['postdata'] || $conf['post'] === true) {
		curl_setopt($ch, CURLOPT_POST, 1);
		$postdata = http_build_query($conf['postdata']);
		$conf['postdata'] && curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); //设置post数据
	} else {
		curl_setopt($ch, CURLOPT_POST, 0);
	}
	// var_dump($conf['postdata']);
	//curl_setopt($ch,CURLOPT_HEADER,1); //将头文件的信息作为数据流输出
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回内容不输出到浏览器
	// curl_setopt($ch, CURLOPT_REFERER, $conf['url']); //设置来源地址
	$conf['headers'] && curl_setopt($ch, CURLOPT_HTTPHEADER, $conf['headers']); //设置请求头
	$result = curl_exec($ch);
	//如果上面设置啦头信息到数据流可以用下面的方法取响应头中的信息
	//$weizhi = strpos($result, "\r\n\r\n");
	//请求头信息
	//$re_header = substr($result, 0, $weizhi);
	//返回的内容
	//$result = substr($result, $weizhi + 4);
	//preg_match_all('/Set-Cookie:stest=(.*)/i', $result, $cookie);
	//请求出错退出
	if ($error = curl_error($ch)) {
		die($error);
	}
	curl_close($ch);
	return $result;
}

有时候为啦方便直接从浏览器中复制头部信息粘贴进去进行测试,可以直接给headers传入换行分隔的字符串


//使用方法
$header = <<<eot
Host:www.yidianzixun.com
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
eot;
echo send_request([
	'url'     => $url,
	'headers' => $header,
]);

curl需要特别注意的地方很大的一个坑一定要看

curl默认post的提交数据的方式是根据post的数据决定的

如果post的数据是字符串则curl默认使用下面的方法提交

Content-Type:application/x-www-form-urlencoded

如果post的数据是是k=>v的键值数组则请求的类型为

multipart/form-data; boundary=------------------------fcafbc7c4e7050c0

如果post的数据传啦一个键值数组但是请求头传啦一个提交方式为下面的,就会报一个异常错误,服务器端就会收不到数据,如下图所示

content-type:application/x-www-form-urlencode

下图中是服务器var_dump($_POST);输出的结果

blob.png

上面curlpost请求时默认是把请求数据转为字符串进行请求的也就是使用下面方式,需要其它方式的话自己修改函数post数据格式

Content-Type: application/x-www-form-urlencoded

第二种

function send_request2($opt = []) {
	$conf = [
		'url'      => '',
		'postdata' => [], //有数据时自动转为post
		'headers'  => [],
		'post'     => false, //默认为false,true时当前请求强制转为post
	];
	$conf = array_merge($conf, $opt);
	if (is_string($conf['headers'])) {
		$conf['headers'] = preg_split('/\r?\n/', $conf['headers']);
	}
	if (!$conf['url']) {
		return '';
	}
	$postdata = http_build_query($conf['postdata']);
	$opts     = [];
	if ($conf['postdata'] || $conf['post'] === true) {
		$opts = [
			'http' => [
				'method'  => 'POST',
				'header'  => 'Content-type: application/x-www-form-urlencoded',
				'content' => $postdata,
			],
		];
	} else {
		$opts = [
			'http' => [
				'method' => 'GET',
				'header' => '',
			],
		];
	}
	if ($conf['headers']) {
		foreach ($conf['headers'] as $key => $value) {
			$opts['http']['header'] .= $opts['http']['header'] ? "\r\n" . $value : $value;
		}
	}
	// var_dump($opts);
	$context = stream_context_create($opts);
	$result  = file_get_contents($conf['url'], false, $context);
	return $result;
}

如果需要保持会话状态就添加下面代码

	//curl_setopt($ch, CURLOPT_COOKIE, "fruit=apple; colour=red");  //直接设置请求的cookie
	//下面是把cookies保存到文件中
	$cookie = './cookie.txt';
	if (!empty($cookie)) {
		curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); // 设置从$cookie所指文件中读取cookie信息以发送
		curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); // 设置将返回的cookie保存到$cookie所指文件
	}



微信号:kelicom QQ交流群:215861553
点击更换验证码
留言