通过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数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
php include加载文件两种方式效率比较
Aug 08 PHP
php读取mysql的简单实例
Jan 15 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
Oct 24 PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 PHP
composer.lock文件的作用
Feb 03 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 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 正则学习实例
2008/07/30 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
JQuery优缺点分析说明
2010/06/09 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
Django如何配置mysql数据库
2018/05/04 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
Europcar比利时:租车
2019/08/26 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
群教个人对照检查材料
2014/08/20 职场文书
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android