在php编程调试时,经常需要模拟提交。
另外,在抓取一些页面时,需要经常请求别人的页面。
于是实现了一个http请求的封装类,以方便调用。
本http请求类,封装了三种post提交方法和一个request请求方法。
1,http请求封闭类
/**
* HTTP常用请求封装
* @version $Id: HttpHelper.php,v 1.0 2012-8-9
* @package library
* @site www.jbxue.com
*/
// ---------------------------
/**
* http请求处理
*
* 开发中经常需要模拟提交请求,本类封装了常用的post方法
*
* @author ustb80
*
*/
class HttpHelper
{
// 当前的user-agent字符串
public $ua_string= "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:14.0) Gecko/20100101 Firefox/14.0.1";
// 支持的提交方式
public $post_type_list = array("curl", "socket", "stream");
// 本地cookie文件
private $cookie_file;
// -----------------------
/**
* 构造函数
*
* @param array $params 初始化参数
*/
public function __construct($params = array())
{
if(count($params) > 0)
{
$this->init($params);
}
}
// -----------------------
/**
* 参数初始化
*
* @param array $params
*/
public function init($params)
{
if(count($params) > 0)
{
foreach($params as $key => $val)
{
if(isset($this->$key))
{
$this->$key = $val;
}
}
}
}
// -----------------------
/**
* 提交请求
*
* @param string $url 请求地址
* @param mixed $data 提交的数据
* @param string $type 提交类型,curl,socket,stream可选
*/
public function post($url, $data, $type = "socket")
{
if(!in_array($type, $this->post_type_list))
{
die("undefined post type");
}
$function_name = $type . "Post";
return call_user_func_array(array($this, $function_name), array($url, $data));
}
// -----------------------
/**
* 更改默认的ua信息
*
* 本方法常用于模拟各种浏览器
*
* @param string $ua_string UA字符串
*/
public function setUA($user_agent)
{
$this->ua_string = $user_agent;
return $this;
}
// -----------------------
/**
* 设置本地cookie文件
*
* 在用curl来模拟时常需要设置此项
*
* @param string $cookie_file 文件路径
*/
public function setCookieFile($cookie_file)
{
$this->cookie_file = $cookie_file;
return $this;
}
// -----------------------
/**
* curl方式提交
*
* @param string $url 请求地址
* @param mixed $data 提交的数据
* @param string $user_agent 自定义的UA
* @return mixed
*/
public function curlPost($url, $data, $user_agent = '')
{
if($user_agent == '')
{
$user_agent = $this->ua_string;
}
if (!is_array($data))
{
$data = array($data);
}
$data = http_build_query($data);
if (!function_exists("curl_init"))
{
die('undefined function curl_init');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
$rs = curl_exec($ch);
curl_close($ch);
return $rs;
}
// -----------------------
/**
* 套接字提交
*
* @param string $url 请求地址
* @param mixed $data 提交的数据
* @param string $user_agent 自定义的UA
* @param int $port 端口
* @param int $timeout 超时限制
* @return mixed
*/
public function socketPost($url, $data, $user_agent = '', $port = 80, $timeout = 30)
{
$url_info = parse_url($url);
$remote_server = $url_info['host'];
$remote_path = $url_info['path'];
$socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
if(!$socket)
{
die("$errstr($errno)");
}
if($user_agent == '')
{
$user_agent = $this->ua_string;
}
if (!is_array($data))
{
$data = array($data);
}
$data = http_build_query($data);
fwrite($socket, "POST {$remote_path} HTTP/1.0\r\n");
fwrite($socket, "User-Agent: {$user_agent}\r\n");
fwrite($socket, "HOST: {$remote_server}\r\n");
fwrite($socket, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($socket, "Content-length: " . strlen($data) . "\r\n");
fwrite($socket, "Accept:*/*\r\n");
fwrite($socket, "\r\n");
fwrite($socket, "{$data}\r\n");
fwrite($socket, "\r\n");
$header = "";
while($str = trim(fgets($socket, 4096)))
{
$header .= $str;
}
$data = "";
while(!feof($socket))
{
$data .= fgets($socket, 4096);
}
return $data;
}
// -----------------------
/**
* 文件流提交
*
* @param string $url 提交地址
* @param string $data 数据
* @param string $user_agent 自定义的UA
* @return mixed
*/
public function streamPost($url, $data, $user_agent = '')
{
if($user_agent == '')
{
$user_agent = $this->ua_string;
}
if (!is_array($data))
{
$data = array($data);
}
$data = http_build_query($data);
$context = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded'
. "\r\n" . 'User-Agent : ' . $user_agent . "\r\n" . 'Content-length: ' . strlen($data),
'content' => $data
)
);
$stream_context = stream_context_create($context);
$data = file_get_contents($url, FALSE, $stream_context);
return $data;
}
// -----------------------
/**
* 发送请求
*
* 本方法通过curl函数向目标服务器发送请求
*
* @param string $url 请求地址
* @return mixed
*/
public function request($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, !empty($this->ua_string)? $this->ua_string : $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if (isset($this->cookie_file))
{
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_file);
}
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
}
?>
调用示例:
require_once 'HttpHelper.php';
$HttpHelper = new HttpHelper();
$url = "http://localhost/post.php";
$data = array("name"=>"socket");
$rs[] = $HttpHelper->post($url, $data);
$data = array("name"=>"curl");
$rs[] = $HttpHelper->post($url, $data, "curl");
$data = array("name"=>"stream");
$rs[] = $HttpHelper->post($url, $data, "stream");
$rs[] = $HttpHelper->request($url);
print_r($rs);
?>
3,post.php文件:
echo 'test request:';
print_r($_REQUEST);
?>
4,输出结果:
Array
(
[0] => test request:Array
(
[name] => socket
)
[1] => test request:Array
(
[name] => curl
)
[2] => test request:Array
(
[name] => stream
)
[3] => test request:Array
(
)
)