• php做接口自动化的核心代码


    php做接口自动化的核心代码

    <?php
    /**
    * aCURL HTTP请求类
    * @date 2011-03-08
    * @author shellbill
    */

    class aCurl{
    private $ch = null; //curl句柄
    private $info = array(); //curl执行过程相关信息
    //curl setopt信息
    private $setopt = array(
    //访问端口
    'port'=>80,
    //客户端 USERAGENT,为空则使用用户的浏览器
    'userAgent'=>'',
    //超时时间
    'timeOut'=>30,
    //是否使用 COOKIE
    //'useCookie'=>true, ##2012-3-15注释,目前平台框架不需要使用cookie,启用此选项会导致运行脚本时在/tmp下产生大量的无用临时文件。By LY
    //是否支持SSL
    'ssl'=>false,
    //是否支持 gzip压缩
    'gzip'=>true,
    'keep-alive'=>true,
    );

    /**
    * 构造函数
    *
    * @param array $setopt
    */
    public function __construct($setopt=array()){
    $this->setopt = array_merge($this->setopt,$setopt);
    function_exists('curl_init') || die('CURL library not exist');
    $this->ch = curl_init(); //初始化
    curl_setopt($this->ch, CURLOPT_PORT, $this->setopt['port']); //设置CURL连接的端口
    curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
    //打开的支持SSL
    if($this->setopt['ssl']){
    //不对认证证书来源的检查
    curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);
    //从证书中检查SSL加密算法是否存在
    curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, true);
    }
    //设置 HTTP USERAGENT
    $userAgent = $this->setopt['userAgent'] ? $this->setopt['userAgent'] : 'ucapp';
    curl_setopt($this->ch, CURLOPT_USERAGENT, $userAgent);
    //设置连接等待时间,0不等待
    curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $this->setopt['timeOut']);
    //设置curl允许执行的最长秒数
    curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->setopt['timeOut']);
    //设置请求端端是否支持 gzip压缩
    if($this->setopt['gzip']){
    curl_setopt($this->ch, CURLOPT_ENCODING, 'gzip');
    }
    //是否使用到COOKIE
    if($this->setopt['useCookie']){
    //生成存放临时COOKIE的文件(要绝对路径)
    $cookfile = tempnam(sys_get_temp_dir(),'cuk');
    //连接关闭以后,存放cookie信息
    curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookfile);
    curl_setopt($this->ch, CURLOPT_COOKIEFILE, $cookfile);
    }
    //是否将头文件的信息作为数据流输出(HEADER信息),这里保留报文
    curl_setopt($this->ch, CURLOPT_HEADER, true);
    //获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($this->ch, CURLOPT_BINARYTRANSFER, true);

    if($this->setopt['keep-alive']){
    $header[] = "Connection: keep-alive";
    curl_setopt($this->ch, CURLOPT_HTTPHEADER, $header);
    }
    }

    /**
    * 以 GET 方式执行请求
    *
    * @param string $url :请求的URL
    * @param array $params :请求的参数,格式如: array('id'=>10,'name'=>'yuanwei')
    * @param array $referer :引用页面,为空时自动设置,如果服务器有对这个控制的话则一定要设置的.
    * @return 错误返回:false 正确返回:结果内容
    */
    public function get($url,$params=array(), &$header='',$referer=''){
    return $this->_request('GET', $url, $params, array(), $referer,$header);
    }

    /**
    * 以 POST 方式执行请求
    *
    * @param string $url :请求的URL
    * @param array $params :请求的参数,格式如: array('id'=>10,'name'=>'yuanwei')
    * @param array $uploadFile :上传的文件,支持相对路径,格式如下
    * 单个文件上传:array('img1'=>'./file/a.jpg')
    * 同字段多个文件上传:array('img'=>array('./file/a.jpg','./file/b.jpg'))
    * @param array $referer :引用页面,引用页面,为空时自动设置,如果服务器有对这个控制的话则一定要设置的.
    * @return 错误返回:false 正确返回:结果内容
    */
    public function post($url,$params=array(),&$header='',$uploadFile=array(), $referer=''){
    return $this->_request('POST', $url, $params, $uploadFile, $referer,$header);
    }

    /**
    * 得到错误信息
    *
    * @return string
    */
    public function error(){
    return curl_error($this->ch);
    }


    /**
    * 得到错误代码
    *
    * @return int
    */
    public function errno(){
    return curl_errno($this->ch);
    }


    /**
    * 得到发送请求前和请求后所有的服务器信息和服务器Header信息,其中
    * [before] :请求前所设置的信息
    * [after] :请求后所有的服务器信息
    * [header] :服务器Header报文信息
    *
    * @return array
    */
    public function info(){
    return $this->info;
    }

    /**
    * 析构函数
    *
    */
    public function __destruct(){
    curl_close($this->ch); //关闭CURL
    }

    /**
    * 私有方法:执行最终请求
    *
    * @param string $method :HTTP请求方式
    * @param string $url :请求的URL
    * @param array $params :请求的参数
    * @param array $uploadFile :上传的文件(只有POST时才生效)
    * @param array $referer :引用页面
    * @return 错误返回:false 正确返回:结果内容
    */
    private function _request($method, $url, $params=array(), $uploadFile=array(), $referer='',&$header=''){
    //如果是以GET方式请求则要连接到URL后面
    if($method == 'GET'){
    $url = $this->_parseUrl($url,$params);
    }
    //设置请求的URL
    curl_setopt($this->ch, CURLOPT_URL, $url);
    //如果是POST
    if($method == 'POST'){
    //发送一个常规的POST请求,类型为:application/x-www-form-urlencoded
    curl_setopt($this->ch, CURLOPT_POST, true) ;
    //设置POST字段值
    $postData = $this->_parsmEncode($params,true);
    //如果有上传文件
    if($uploadFile){
    foreach($uploadFile as $key=>$file){
    if(is_array($file)){
    $n = 0;
    foreach($file as $f){
    //文件必需是绝对路径
    $postData[$key.'['.$n++.']'] = '@'.realpath($f);
    }
    }else{
    $postData[$key] = '@'.realpath($file);
    }
    }
    }
    //pr($postData); die;
    curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postData);
    }
    //设置了引用页,否则自动设置
    if($referer){
    curl_setopt($this->ch, CURLOPT_REFERER, $referer);
    }else{
    curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);
    }
    //得到所有设置的信息
    $this->info['before'] = curl_getinfo($this->ch);
    //开始执行请求
    $result = curl_exec($this->ch);
    //得到报文头
    $headerSize = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);
    $this->info['header'] = substr($result, 0, $headerSize);
    $header = substr($result, 0, $headerSize);
    //去掉报文头
    $result = substr($result, $headerSize);
    //得到所有包括服务器返回的信息
    $this->info['after'] = curl_getinfo($this->ch);
    //如果请求成功
    if($this->errno() == 0){ //&& $this->info['after']['http_code'] == 200
    return $result;
    }else{
    return false;
    }


    }

    /**
    * 返回解析后的URL,GET方式时会用到
    *
    * @param string $url :URL
    * @param array $params :加在URL后的参数
    * @return string
    */
    private function _parseUrl($url,$params){
    $fieldStr = $this->_parsmEncode($params);
    if($fieldStr){
    $url .= strstr($url,'?')===false ? '?' : '&';
    $url .= $fieldStr;
    }
    return $url;
    }

    /**
    * 对参数进行ENCODE编码
    *
    * @param array $params :参数
    * @param bool $isRetStr : true:以字符串返回 false:以数组返回
    * @return string || array
    */
    private function _parsmEncode($params,$isRetStr=true){
    $fieldStr = '';
    $spr = '';
    $result = array();
    foreach($params as $key=>$value){
    $value = urlencode($value);
    $fieldStr .= $spr.$key .'='. $value;
    $spr = '&';
    $result[$key] = $value;
    }
    return $isRetStr ? $fieldStr : $result;
    }
    }

    ?>

  • 相关阅读:
    从外部访问 Template (模板)的控件、获取它的属性值
    继续聊WPF——动态数据模板
    WPF数据模板样式选择器
    深入理解正则表达式
    nssm使用,安装服务、删除服务
    Windows删除某服务
    nssm设置solr开机启动服务
    Windows下直接双击可执行的jar
    Unsupported major.minor version 52.0——解决
    js延迟2秒执行事件
  • 原文地址:https://www.cnblogs.com/zhitang2009/p/3425065.html
Copyright © 2020-2023  润新知