通过curl模拟post和get方式提交的表单类


Posted in PHP onApril 23, 2014

最近做项目,后台已经做好了但是前台的模版还没下来,所以测试比较麻烦。于是写了个简单的脚本通过curl的方式模拟表单提交。可以通过数组和字符串两种方式提交数据。

<?php
/**
 * Class SimulantForm 模拟表单
 */
class SimulantForm {
    /**
     * @var 要提交的页面url
     */
    protected $_url;
    /**
     * @var resource curl_init()返回的curl句柄
     */
    protected $_ch;
    /**
     * 初始化一个表单
     * @param $_url url
     */
    public function __construct($_url) {
  $this->_ch = curl_init();
  $this->setUrl($_url);
  curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, 1);
 }
    /**
     * get方式提交
     * @param array|string 表单数据
     * @return mixed
     */
    public function get($_data = '') { 
  $this->_url .= $this->_setGetData($_data);
  $this->setUrl($this->_url);
  $result = curl_exec($this->_ch);
        curl_close($this->_ch);
        return $result;
 }
    /**
     * post方式提交
     * @param array|string 表单数据
     * @return mixed
     */
    public function post($_data) {
  curl_setopt($this->ch, CURLOPT_POST, 1);
  $this->_setPostData($_data);
  $result = curl_exec($this->_ch);
        curl_close($this->_ch);
        return $result;
 }
    /**
     * 返回错误信息
     * @return array array[0]:错误号 , array[1]:错误信息
     */
    public function getLastError() {
  return array(curl_errno($this->_ch), curl_error($this->_ch));
 }
 /**
  * 设置SETOPT_COOKIEFILE
  * @param string $_cookieFile 文件真实路径
  */
 public function setCookieFile($_cookieFile) {
  curl_setopt($this->_ch, CURLOPT_COOKIEFILE, $_cookieFile);
 }
 /**
  * 设置SETOPT_COOKIEJAR
  * @param string $_cookieFile 文件真实路径
  */
    public function setCookieJar($_cookieFile) {
        curl_setopt($this->_ch, CURLOPT_COOKIEJAR, $_cookieFile);
    }
 /**
     * 设置url
     * @param $_url
     */
    protected function setUrl($_url) {
  $this->_url = $_url;
  curl_setopt($this->_ch, CURLOPT_URL, $_url);
 }
    /**
     * 设置get方式提交时的数据
     * @param $_get_data 字符串或数组
     * @return mixed
     */
    protected function _setGetData($_get_data) {
        if(is_array($_get_data)) {
           return $this->_getDataToString($_get_data);
        } elseif(is_string($_get_data)) {
           return $_get_data;
        }
    }
    /**
     * 设置post方式提交时的数据
     * @param array|string $_post_data
     */
    protected function _setPostData ($_post_data) {
        curl_setopt($this->_ch, CURLOPT_POSTFIELDS, $_post_data);
    }
    /**
     * 将提交的数组形式的信息解析为字符串用于get方式提交
     * @param array $_get_data
     * @return string
     */
    protected function _getDataToString(array $_get_data) {
  $result_string = '?';
  array_walk($_get_data, function ($value, $key) use (&$result_string) {
   if(is_array($value)) {
    foreach($value as $sec_value) {
     $result_string .= $key . '[]=' . $sec_value . '&';
    }
   } else {
    $result_string .= $key . '=' . $value . '&';
   }
  });
  return substr($result_string, 0, strlen($result_string) - 1);
 }
}
PHP 相关文章推荐
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
thinkPHP中验证码的简单使用方法
Dec 26 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
php编程每天必学之表单验证
Mar 01 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
Oct 03 PHP
Yii框架数据模型的验证规则rules()被执行的方法
Dec 02 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
Apr 23 #PHP
php自定义session示例分享
Apr 22 #PHP
php cli换行示例
Apr 22 #PHP
php使用百度天气接口示例
Apr 22 #PHP
phpmailer中文乱码问题的解决方法
Apr 22 #PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 #PHP
自己写了一个php检测文件编码的函数
Apr 21 #PHP
You might like
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
Python Requests安装与简单运用
2016/04/07 Python
Python 数据结构之旋转链表
2017/02/25 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
安全生产汇报材料
2014/02/17 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python