通过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高级编程-函数-郑阿奇
Jul 04 PHP
php 中英文语言转换类
Sep 07 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
php5.3以后的版本连接sqlserver2000的方法
Jul 28 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
php $_SESSION会员登录实例分享
Jan 19 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
python基于右递归解决八皇后问题的方法
2015/05/25 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
利用python实现AR教程
2019/11/20 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Python如何将函数值赋给变量
2020/04/28 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
优秀志愿者事迹材料
2014/02/03 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
服装设计师求职信
2014/06/04 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
放射科岗位职责
2015/02/14 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
Python 键盘事件详解
2021/11/11 Python
Golang 切片(Slice)实现增删改查
2022/04/22 Golang