如何在PHP中使用curl函数来模拟发送HTTP请求和获取响应?
Curl是PHP中常用的一个扩展,能够模拟HTTP请求,比如发送POST、GET请求等,并获取响应内容。使用curl函数发送HTTP请求,实际上是通过curl库的API实现的,可以选择使用curl库直接编写C语言的代码,也可以使用php中的curl函数进行简单封装。下面我们就来详细介绍如何使用curl函数模拟发送HTTP请求和获取响应。
1.发送GET请求
发送GET请求最简单的方法就是使用curl函数:
function curl_get($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不输出到屏幕上,而是返回给变量
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
$result = curl_get("http://www.example.com/");
其中curl_setopt设置选项,CURLOPT_URL设置请求的URL,CURLOPT_RETURNTRANSFER设置为1表示不直接输出结果,而是返回给$output变量。当然在CURLOPT_RETURNTRANSFER后也可以加参数,如“1”等,表示为“1”时返回结果(curl_exec()执行成功),为“FALSE”时什么都不输出,为“0”或““空字符”等和为“1”时相反。
最后要关闭curl句柄,以释放资源。
2.发送POST请求
发送POST请求比GET请求稍微复杂一些,在调用curl函数之前需要设置POST参数:
function curl_post($url, $data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
$post_data = array(
'username' => 'testuser',
'password' => 'testpass',
);
$result = curl_post("http://www.example.com/login.php", $post_data);
发送POST请求时,需要设置CURLOPT_POST选项为1,表示这是一个POST请求。同时还需要设置CURLOPT_POSTFIELDS选项,并传入POST的数据。
3.设置请求头
在发送HTTP请求时,还可以设置请求头,例如:
function curl_post_with_header($url, $data){
$header = array(
"Content-Type:application/json",
"User-Agent: Mozilla",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
$post_data = json_encode(array(
'username' => 'testuser',
'password' => 'testpass',
));
$result = curl_post_with_header("http://www.example.com/login.php", $post_data);
其中,设置请求头需要使用CURLOPT_HTTPHEADER选项,传入一个数组即可。上面的例子设置了两个请求头,Content-Type为application/json,和User-Agent为Mozilla。一般在模拟爬虫,或者爬取API数据时都需要设置User-Agent,否则可能会被服务器拒绝请求。
4.处理响应
当使用curl发送完HTTP请求后,可以通过curl_getinfo和curl_error来获取一些数据和错误信息。比如:
function curl_get($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
if($output === false){
echo 'curl error: '.curl_error($ch);
}
else{
echo 'http code: '.curl_getinfo($ch, CURLINFO_HTTP_CODE);
}
curl_close($ch);
return $output;
}
使用CURLINFO_HTTP_CODE来获取HTTP状态码,当访问失败,或者响应码不是200时,可以进行相应处理,比如抛出异常,不然的话,直接返回数据会有一定的风险。
另外,curl_exec成功返回数据时可能会包含HTTP头信息(注意,不是HTTP响应正文),可以通过CURLOPT_HEADER选项关闭。当然,如果需要获取HTTP头信息,可以设置CURLOPT_HEADER选项为1,然后在结果数据中再截取出相应的部分。一般情况下,获取HTTP头信息并不是很必要,因为大部分情况下我们更关心的是响应正文的内容。
5.使用cookie
在发送HTTP请求的时候,使用cookie可以帮助模拟登录、操作全局变量、记录操作等。使用curl函数发送HTTP请求时候,需要设置相应的cookie和session,才能让服务器返回正确的响应内容。
function curl_get_with_cookie($url, $cookie_file=null){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
$cookie_file = 'cookie.txt';
$result = curl_get_with_cookie('http://www.example.com/', $cookie_file);
说明:在使用CURLOPT_COOKIEFILE设置cookie文件所在位置时,该文件如果不存在会自动创建;而在使用CURLOPT_COOKIEJAR设置cookie时,如果该文件不存在,则不会创建。
此外,以上的函数都可以调用curl_setopt函数进行其他更详细的设置,例如设置超时时间、设置请求代理等,具体可看php官方文档,这里不再详细讲述。
