php http 类,php写的http请求封装类

本文档介绍了一个PHP类,用于封装HTTP请求,包括curl、socket和stream三种POST方法及一个通用的request方法。示例代码展示了如何使用这个类进行HTTP请求,模拟提交数据到目标URL,并获取响应。
摘要由CSDN通过智能技术生成

在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

(

)

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值