通过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加速器eAccelerator的配置参数、API详解
May 05 PHP
php快递单号查询接口使用示例
May 05 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
php-redis中的sort排序函数总结
Jul 08 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
PHP 实现浏览记录并按日期分组
May 11 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
smarty模板的使用方法实例分析
Sep 18 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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/10/08 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
javascript 图片裁剪技巧解读
2012/11/15 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
bootstrap多种样式进度条展示
2016/12/20 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
python实现ping的方法
2015/07/06 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
Python内置异常类型全面汇总
2020/05/28 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
荷兰家电销售网站:Welhof
2020/12/08 全球购物
个人自我鉴定写法
2013/11/30 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
Python机器学习之决策树和随机森林
2021/07/15 Javascript
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
Vue Element plus使用方法梳理
2022/12/24 Vue.js