通过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 strlen mb_strlen计算中英文混排字符串长度
Jul 10 PHP
PHP 替换模板变量实现步骤
Aug 24 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
PHP根据两点间的经纬度计算距离
Oct 31 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
PHP中使用php://input处理相同name值的表单数据
Feb 03 PHP
php保存任意网络图片到服务器的方法
Apr 14 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
抛弃 PHP 代价太高
Apr 26 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安全配置方法
2007/06/16 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Python线程中对join方法的运用的教程
2015/04/09 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
python与js主要区别点总结
2020/09/13 Python
如何查看python关键字
2021/01/17 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
《草原》教学反思
2014/02/15 职场文书
部队党性分析材料
2014/02/16 职场文书
电信营业员岗位职责
2015/04/14 职场文书
校园开放日新闻稿
2015/07/17 职场文书
总经理聘用协议书
2015/09/21 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
Java中API的使用方法详情
2022/04/06 Java/Android