`

URL 模似HTTP请求工具,

    博客分类:
  • php
阅读更多
<?php



/**
 * CURL 模似HTTP请求工具,

 * 支持以下功能:
 * 1:支持ssl连接和proxy代理连接
 * 2: 对cookie的自动支持
 * 3: 简单的GET/POST常规操作
 * 4: 支持单个文件上传或同字段的多文件上传,支持相对路径或绝对路径.
 * 5: 支持返回发送请求前和请求后所有的服务器信息和服务器Header信息
 * 6: 自动支持lighttpd服务器
 * 7: 支持自动设置 REFERER 引用页
 * 8: 自动支持服务器301跳转或重写问题(谢谢郑GG)
 * 9: 其它可选项,如自定义端口,超时时间,USERAGENT,Gzip压缩等.

============= 求例如下 ===============
include('clsss/class.curl.php');
$cu = new Curl();

//得到 baidu 的首页内容
echo $cu->get('http://www.baidu.com');

//登录到QuickPHP实例中并且得到所有用户信息
$cu->post('http://www.myquickphp.com/code/qpdemo/?c=main&a=login',array('uname'=>'admin','upass'=>'admin'));
echo $cu->get('http://www.myquickphp.com/code/qpdemo');

//向 http://a.com/a.php 上传内容和文件, a.php 的测试代码可以如下:
//<?php print_r($_POST);print_r($_FILES); />
echo $cu->post('http://a.com/a.php',array('id'=>1,'name'=>'yuanwei'),
array('img'=>'file/a.jpg','files'=>array('file/1.zip','file/2.zip')));

//得到所有调试信息
echo '<br/>','ERRNO=',$cu->errno();
echo '<br/>','ERROR=',$cu->error();
echo '<pre>'.print_r($cu->getinfo(),true).'</pre>';

 */
class Curl{

	//CURL句柄
	private $ch = null;
	//CURL执行前后所设置或服务器端返回的信息
	private $info = array();
	//CURL SETOPT 信息
	private $setopt = array(
		//访问的端口,http默认是 80
		'port'=>80,
		//客户端 USERAGENT,如:"Mozilla/4.0",为空则使用用户的浏览器
		'userAgent'=>'',
		//连接超时时间
		'timeOut'=>30,
		//是否使用 COOKIE 建议打开,因为一般网站都会用到
		'useCookie'=>true,
		//是否支持SSL
		'ssl'=>false,
		//客户端是否支持 gzip压缩
		'gzip'=>true,

		//是否使用代理
		'proxy'=>false,
		//代理类型,可选择 HTTP 或 SOCKS5
		'proxyType'=>'HTTP',
		//代理的主机地址,如果是 HTTP 方式则要写成URL形式如:"http://www.proxy.com"
		//SOCKS5 方式则直接写主机域名为IP的形式,如:"192.168.1.1"
		'proxyHost'=>'http://www.proxy.com',
		//代理主机的端口
		'proxyPort'=>1234,
		//代理是否要身份认证(HTTP方式时)
		'proxyAuth'=>false,
		//认证的方式.可选择 BASIC 或 NTLM 方式
		'proxyAuthType'=>'BASIC',
		//认证的用户名和密码
		'proxyAuthUser'=>'user',
		'proxyAuthPwd'=>'password',
		);

	/**
	 * 构造函数
	 *
	 * @param array $setopt :请参考 private $setopt 来设置
	 */
	public function __construct($setopt=array())
	{
		//合并用户的设置和系统的默认设置
		$this->setopt = array_merge($this->setopt,$setopt);
		//如果没有安装CURL则终止程序
		function_exists('curl_init') || die('CURL Library Not Loaded');
		//初始化
		$this->ch = curl_init();
		//设置CURL连接的端口
		curl_setopt($this->ch, CURLOPT_PORT, $this->setopt['port']);
		//使用代理
		if($this->setopt['proxy']){
			$proxyType = $this->setopt['proxyType']=='HTTP' ? CURLPROXY_HTTP : CURLPROXY_SOCKS5;
			curl_setopt($this->ch, CURLOPT_PROXYTYPE, $proxyType);
			curl_setopt($this->ch, CURLOPT_PROXY, $this->setopt['proxyHost']);
			curl_setopt($this->ch, CURLOPT_PROXYPORT, $this->setopt['proxyPort']);
			//代理要认证
			if($this->setopt['proxyAuth']){
				$proxyAuthType = $this->setopt['proxyAuthType']=='BASIC' ? CURLAUTH_BASIC : CURLAUTH_NTLM;
				curl_setopt($this->ch, CURLOPT_PROXYAUTH, $proxyAuthType);
				$user = "[{$this->setopt['proxyAuthUser']}]:[{$this->setopt['proxyAuthPwd']}]";
				curl_setopt($this->ch, CURLOPT_PROXYUSERPWD, $user);
			}
		}
		//启用时会将服务器服务器返回的“Location:”放在header中递归的返回给服务器
		curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
		//打开的支持SSL
		if($this->setopt['ssl']){
			//不对认证证书来源的检查
			curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);
			//从证书中检查SSL加密算法是否存在
			curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, true);
		}
		//设置http头,支持lighttpd服务器的访问
		$header[]= 'Expect:';
		curl_setopt($this->ch, CURLOPT_HTTPHEADER, $header);
		//设置 HTTP USERAGENT
		$userAgent = $this->setopt['userAgent'] ? $this->setopt['userAgent'] : $_SERVER['HTTP_USER_AGENT'];
		curl_setopt($this->ch, CURLOPT_USERAGENT, $userAgent);
		//设置连接等待时间,0不等待
		curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $this->setopt['timeOut']);
		//设置curl允许执行的最长秒数
		curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->setopt['timeOut']);
		//设置客户端是否支持 gzip压缩
		if($this->setopt['gzip']){
			curl_setopt($this->ch, CURLOPT_ENCODING, 'gzip');
		}
		//是否使用到COOKIE
		if($this->setopt['useCookie']){
			//生成存放临时COOKIE的文件(要绝对路径)
			$cookfile = tempnam('/tmp','cuk');
			//pr(sys_get_temp_dir());
			//连接关闭以后,存放cookie信息
			curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookfile);
			curl_setopt($this->ch, CURLOPT_COOKIEFILE, $cookfile);
		}
		//是否将头文件的信息作为数据流输出(HEADER信息),这里保留报文
		curl_setopt($this->ch, CURLOPT_HEADER, true);
		//获取的信息以文件流的形式返回,而不是直接输出。
		curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true) ;
		curl_setopt($this->ch, CURLOPT_BINARYTRANSFER, true) ;
	}

	/**
	 * 以 GET 方式执行请求
	 *
	 * @param string $url :请求的URL
	 * @param array $params :请求的参数,格式如: array('id'=>10,'name'=>'yuanwei')
	 * @param array $referer :引用页面,为空时自动设置,如果服务器有对这个控制的话则一定要设置的.
	 * @return 错误返回:false 正确返回:结果内容
	 */
	public function get($url,$params=array(), $referer='')
	{
		return $this->_request('GET', $url, $params, array(), $referer);
	}

	/**
	 * 以 POST 方式执行请求
	 *
	 * @param string $url :请求的URL
	 * @param array $params :请求的参数,格式如: array('id'=>10,'name'=>'yuanwei')
	 * @param array $uploadFile :上传的文件,支持相对路径,格式如下
	 * 单个文件上传:array('img1'=>'./file/a.jpg')
	 * 同字段多个文件上传:array('img'=>array('./file/a.jpg','./file/b.jpg'))
	 * @param array $referer :引用页面,引用页面,为空时自动设置,如果服务器有对这个控制的话则一定要设置的.
	 * @return 错误返回:false 正确返回:结果内容
	 */
	public function post($url,$params=array(),$uploadFile=array(), $referer='')
	{
		return $this->_request('POST', $url, $params, $uploadFile, $referer);
	}

	/**
	 * 得到错误信息
	 *
	 * @return string
	 */
	public function error()
	{
		return curl_error($this->ch);
	}

	/**
	 * 得到错误代码
	 *
	 * @return int
	 */
	public function errno()
	{
		return curl_errno($this->ch);
	}

	/**
	 * 得到发送请求前和请求后所有的服务器信息和服务器Header信息,其中
	 * [before] :请求前所设置的信息
	 * [after] :请求后所有的服务器信息
	 * [header] :服务器Header报文信息
	 *
	 * @return array
	 */
	public function getInfo()
	{
		return $this->info;
	}

	/**
	 * 析构函数
	 *
	 */
	public function __destruct()
	{
		//关闭CURL
		curl_close($this->ch);
	}

	/**
	 * 私有方法:执行最终请求
	 *
	 * @param string $method :HTTP请求方式
	 * @param string $url :请求的URL
	 * @param array $params :请求的参数
	 * @param array $uploadFile :上传的文件(只有POST时才生效)
	 * @param array $referer :引用页面
	 * @return 错误返回:false 正确返回:结果内容
	 */
	private function _request($method, $url, $params=array(), $uploadFile=array(), $referer='')
	{
		//如果是以GET方式请求则要连接到URL后面
		if($method == 'GET'){
			$url = $this->_parseUrl($url,$params);
		}
		//设置请求的URL
		curl_setopt($this->ch, CURLOPT_URL, $url);
		//如果是POST
		if($method == 'POST'){
			//发送一个常规的POST请求,类型为:application/x-www-form-urlencoded
			curl_setopt($this->ch, CURLOPT_POST, true) ;
			//设置POST字段值
			$postData = $this->_parsmEncode($params,false);
			//如果有上传文件
			if($uploadFile){
				foreach($uploadFile  as $key=>$file){
					if(is_array($file)){
						$n = 0;
						foreach($file as $f){
							//文件必需是绝对路径
							$postData[$key.'['.$n++.']'] = '@'.realpath($f);
						}
					}else{
						$postData[$key] = '@'.realpath($file);
					}
				}
			}
			//pr($postData); die;
			//设置表单数据
			curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postData);
		}
		//设置了引用页,否则自动设置
		if($referer){
			curl_setopt($this->ch, CURLOPT_REFERER, $referer);
		}else{
			curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);
		}
		//得到所有设置的信息
		$this->info['before'] = curl_getinfo($this->ch);
		//开始执行请求
		$result = curl_exec($this->ch);
		//得到报文头
		$headerSize = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);
		$this->info['header'] = substr($result, 0, $headerSize);
		//去掉报文头
		$result = substr($result, $headerSize);
		//得到所有包括服务器返回的信息
		$this->info['after'] = curl_getinfo($this->ch);
		//如果请求成功
		if($this->errno() == 0){ //&& $this->info['after']['http_code'] == 200
			return $result;
		}else{
			return false;
		}

	}

	/**
	 * 返回解析后的URL,GET方式时会用到
	 *
	 * @param string $url :URL
	 * @param array $params :加在URL后的参数
	 * @return string
	 */
	private function _parseUrl($url,$params)
	{
		$fieldStr = $this->_parsmEncode($params);
		if($fieldStr){
			$url .= strstr($url,'?')===false ? '?' : '&';
			$url .= $fieldStr;
		}
		return $url;
	}

	/**
	 * 对参数进行ENCODE编码
	 *
	 * @param array $params :参数
	 * @param bool $isRetStr : true:以字符串返回 false:以数组返回
	 * @return string || array
	 */
	private function _parsmEncode($params,$isRetStr=true)
	{
		$fieldStr = '';
		$spr = '';
		$result = array();
		foreach($params as $key=>$value){
			$value = urlencode($value);
			$fieldStr .= $spr.$key .'='. $value;
			$spr = '&';
			$result[$key] = $value;
		}
		return $isRetStr ? $fieldStr : $result;
	}



}
分享到:
评论

相关推荐

    模拟HTTP请求工具

    1. 发送不同类型的HTTP请求:模拟请求工具能模拟多种HTTP方法,包括GET、POST、PUT、DELETE、PATCH等。 2. 设置请求头:用户可以自定义请求头,如Content-Type(定义数据类型)、Authorization(认证信息)等。 3. ...

    Http模拟请求工具

    Http模拟请求工具是一种在Windows操作系统上使用的应用程序,它允许用户模拟发送HTTP的GET和POST请求。这个工具对于开发者、测试人员以及对网络交互有需求的人来说非常有用,因为它可以帮助他们理解和测试Web服务,...

    Http请求模拟报文返回工具

    《Http请求模拟报文返回工具详解》 在IT行业中,Http请求模拟报文返回工具扮演着重要的角色。它允许开发者和测试人员在不依赖实际服务器的情况下,模拟HTTP响应,进行功能验证、性能测试或者异常情况的模拟。这种...

    模拟http请求 post get

    7. 学习HTTP协议:对于学习HTTP协议的细节,模拟请求工具是很好的实践平台,能直观地看到请求和响应的各个部分。 总之,模拟HTTP请求对于开发者来说是一个强大的工具,无论是进行API测试、性能测试还是学习HTTP协议...

    模拟Http协议请求内容工具WFetch

    **WFetch:强大的HTTP协议模拟请求工具** WFetch是一款用于模拟HTTP协议请求的实用工具,它使得开发者和网络管理员能够方便地发送各种HTTP请求,并获取服务器的响应,从而进行网络调试、性能测试或者问题排查。这款...

    模拟HTTP请求-httpdebug

    当我们需要测试、调试或者学习HTTP协议时,模拟HTTP请求的工具就显得尤为重要。"httpdebug"便是这样一款工具,它为开发者提供了一个直观的平台,以模拟不同的HTTP请求并观察其响应结果。 httpdebug的主要功能包括:...

    java发送http请求工具类

    然而,为了提高代码的可复用性和易用性,这个工具类通常会封装成一个静态方法,接收请求URL、方法、参数等作为参数,返回响应结果。此外,还可以添加异常处理,处理网络错误、超时等问题。 请注意,虽然`...

    模拟浏览器发送http请求的工具

    Advanced REST Client(ARC)是一款强大的开发工具,专为这个目的设计,它允许用户模拟浏览器发送各种类型的HTTP请求,并查看详细的响应结果。这款工具对于前端开发者、后端开发者以及API测试人员来说都极具价值。 ...

    c# http请求模拟

    总之,C#中的HTTP请求模拟是一个强大的工具,能够帮助开发者在各种场景下与服务器进行交互。通过理解和熟练运用`HttpClient`,你可以轻松地构建可靠的网络通信功能。在`TestHttpPost`这样的实践中,你将进一步掌握...

    http请求工具源码

    《HTTP请求工具源码解析与应用》 在IT行业中,HTTP请求是我们进行Web开发和测试不可或缺的一部分。本文将深入探讨一款基于.NET 4.0框架编写的HTTP请求工具的源码,帮助开发者理解其工作原理,并能灵活运用到日常...

    网络请求模拟工具postman mac环境

    Postman是一款强大的网络请求模拟工具,尤其在mac环境下,它为开发者提供了便利的API测试与调试功能。Postman不仅能够发送各种HTTP请求,如GET、POST、PUT等,还支持设置请求头、查询参数、请求体,以及处理响应数据...

    模拟http请求发送接收数据

    模拟HTTP请求工具有很多,例如Python的requests库、JavaScript的axios、curl命令行工具等。以Python的requests为例,你可以通过以下代码模拟POST请求: ```python import requests url = 'http://example.com/api'...

    Java实现的Https请求工具类

    综上所述,Java实现的HTTPS请求工具类通常会封装以上步骤,提供简洁的API供其他模块调用。通过这个工具类,开发者可以轻松地发起HTTPS请求,获取服务器响应,并进行数据交互,同时确保通信过程的安全性。在实际项目...

    PHP在单元测试中模拟HTTP请求的库.zip

    这个库提供了一个方便的工具,允许开发者在单元测试中创建和管理模拟的HTTP响应,而无需实际发送网络请求。这提高了测试的效率,减少了外部服务的影响,并使测试更加可控和可预测。 在描述中提到的"一个在单元测试...

    java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)

    在Java编程中,有时我们需要模拟浏览器发送HTTP请求,例如调用外部接口或API。`HttpURLConnection`是Java标准库提供的一种轻量级的HTTP客户端,它允许我们在后台代码中发送GET和POST请求。本篇文章将深入讲解如何...

    http请求测试工具

    在实际使用中,该工具可以帮助开发者检查URL的有效性、验证请求头、测试不同的HTTP方法、分析响应内容以及调试服务器端代码。通过自定义headers和cookie,用户还可以模拟不同的用户环境,确保应用在各种情况下的表现...

    非常好用的模拟请求软件Httpdebug

    2. **模拟POST请求**:设置URL、HTTP方法为POST,添加请求头和请求体,提交数据到服务器。 3. **自定义请求头**:根据需要设置各种请求头,如Content-Type(例如,application/json或application/x-...

    模拟http调试工具

    "模拟http调试工具"正是这样一款工具,它允许用户在本地环境中轻松地模拟POST和GET请求,以便于测试API接口或者理解HTTP通信过程。这款工具的便捷之处在于无需对文件进行解压,可以直接运行`httpdebug.exe`来开始...

    c#模拟HTTP请求+验证码识别+图像处理类+QQ协议

    在IT行业中,网络编程是不可或缺的一部分,而C#语言提供了丰富的库来支持各种网络操作,包括模拟HTTP请求。本文将深入探讨如何使用C#进行HTTP请求的模拟,结合验证码识别和图像处理技术,以及理解QQ协议的基础知识。...

Global site tag (gtag.js) - Google Analytics