thinkphp中对请求封装

请求的封装

php 复制代码
//调用
$res = Http::post($this->baseUrl . $url,$params,[
    CURLOPT_HTTPHEADER => [
         'Content-Type: application/json',
         'Content-Length: ' . strlen($params),
     ],
 ]);

<?php
namespace fast;
/**
 * 字符串类
 */
class Http
{

    /**
     * 发送一个POST请求
     */
    public static function post($url, $params = [], $options = []) {
        $req = self::sendRequest($url, $params, 'POST', $options);
        return $req['ret'] ? $req['msg'] : '';
    }

    /**
     * 发送一个GET请求
     */
    public static function get($url, $params = [], $options = []) {
        $req = self::sendRequest($url, $params, 'GET', $options);
        return $req['ret'] ? $req['msg'] : '';
    }

    /**
     * 发送一个POST JSON请求
     */
    public static function postJson($url, $params = [], $options = []) {
        is_array($params) && $params = json_encode($params, JSON_UNESCAPED_UNICODE);
        $req = self::sendRequest($url, $params, 'POST', array_merge_replace([
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'Content-Length: ' . strlen($params),
            ],
        ], $options));
        return $req['ret'] ? $req['msg'] : '';
    }

    /**
     * CURL发送Request请求,含POST和REQUEST
     * @param string $url 请求的链接
     * @param mixed $params 传递的参数
     * @param string $method 请求的方法
     * @param mixed $options CURL的参数
     * @return array
     */
    public static function sendRequest($url, $params = [], $method = 'POST', $options = []) {
        $method = strtoupper($method);
        $protocol = substr($url, 0, 5);
        if (stripos($url, '/product/collectorUploadImg') !== false || stripos($url, '/assemblers/upload') !== false || stripos($url, '/product/tinymecFileAllow') !== false
            || stripos($url, '/refund/uploadFile') !== false || stripos($url, '/invoice/uploadPdfLimitTwoMega') !== false
            || stripos($url, '/base/upload/uploadImgLimitForApi') !== false || stripos($url, '/item/seller/itemPublish/publishItemForApi') !== false
            || stripos($url, '/product/contractUploadImg') !== false) {
            //国铁推送文件信息
            $query_string = $params;
        } else {
            $query_string = is_array($params) ? http_build_query($params) : $params;
        }
        $ch = curl_init();
        $defaults = [];
        if ('GET' == $method) {
            $geturl = $query_string ? $url . (stripos($url, "?") !== FALSE ? "&" : "?") . $query_string : $url;
            $defaults[CURLOPT_URL] = $geturl;
        } else {
            $defaults[CURLOPT_URL] = $url;
            if ($method == 'POST') {
                $defaults[CURLOPT_POST] = 1;
            } else {
                $defaults[CURLOPT_CUSTOMREQUEST] = $method;
            }
            $defaults[CURLOPT_POSTFIELDS] = $query_string;
        }

        $defaults[CURLOPT_HEADER] = FALSE;
        $defaults[CURLOPT_USERAGENT] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36";
        $defaults[CURLOPT_FOLLOWLOCATION] = TRUE;
        $defaults[CURLOPT_RETURNTRANSFER] = TRUE;
        $defaults[CURLOPT_CONNECTTIMEOUT] = 3;
        $defaults[CURLOPT_TIMEOUT] = 3000;
        // disable 100-continue
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
        if ('https' == $protocol) {
            $defaults[CURLOPT_SSL_VERIFYPEER] = FALSE;
            $defaults[CURLOPT_SSL_VERIFYHOST] = FALSE;
        }
        curl_setopt_array($ch, (array) $options + $defaults);
        $ret = curl_exec($ch);
        $err = curl_error($ch);
        if (FALSE === $ret || !empty($err)) {
            $errno = curl_errno($ch);
            $info = curl_getinfo($ch);
            curl_close($ch);
            return ['ret'=>FALSE, 'errno'=>$errno, 'msg'=>$err, 'info'=>$info];
        }
        curl_close($ch);
        return ['ret'=>TRUE, 'msg'=>$ret];
    }

    /**
     * 异步发送一个请求
     * @param string $url 请求的链接
     * @param mixed $params 请求的参数
     * @param string $method 请求的方法
     * @return boolean TRUE
     */
    public static function sendAsyncRequest($url, $params = [], $method = 'POST') {
        $method = strtoupper($method);
        $method = $method == 'POST' ? 'POST' : 'GET';
        //构造传递的参数
        if (is_array($params)) {
            $post_params = [];
            foreach ($params as $k => &$v) {
                if (is_array($v))
                    $v = implode(',', $v);
                $post_params[] = $k . '=' . urlencode($v);
            }
            $post_string = implode('&', $post_params);
        } else {
            $post_string = $params;
        }
        $parts = parse_url($url);
        //构造查询的参数
        if ($method == 'GET' && $post_string) {
            $parts['query'] = isset($parts['query']) ? $parts['query'] . '&' . $post_string : $post_string;
            $post_string = '';
        }
        $parts['query'] = isset($parts['query']) && $parts['query'] ? '?' . $parts['query'] : '';
        //发送socket请求,获得连接句柄
        $fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 3);
        if (!$fp)
            return FALSE;
        //设置超时时间
        stream_set_timeout($fp, 3);
        $out = "{$method} {$parts['path']}{$parts['query']} HTTP/1.1\r\n";
        $out.= "Host: {$parts['host']}\r\n";
        $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
        $out.= "Content-Length: " . strlen($post_string) . "\r\n";
        $out.= "Connection: Close\r\n\r\n";
        if ($post_string !== '')
            $out .= $post_string;
        fwrite($fp, $out);
        //不用关心服务器返回结果
        //echo fread($fp, 1024);
        fclose($fp);
        return TRUE;
    }

    /**
     * 发送文件到客户端
     * @param string $file
     * @param bool $delaftersend
     * @param bool $exitaftersend
     */
    public static function sendToBrowser($file, $delaftersend = true, $exitaftersend = true) {
        if (file_exists($file) && is_readable($file)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment;filename = ' . basename($file));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check = 0, pre-check = 0');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file));
            ob_clean();
            flush();
            readfile($file);
            if ($delaftersend) {
                unlink($file);
            }
            if ($exitaftersend) {
                exit;
            }
        }
    }

}
相关推荐
斯密码赛我是美女3 小时前
laravel Blade 模板引擎
php·laravel
Wiktok3 小时前
ThinkPHP6用户登录系统的全过程
php·mvc
Hacker_LaoYi3 小时前
网络安全工具nc(NetCat)
安全·web安全·php
zzyh12345614 小时前
tcp/ip协议配置参数有哪些?tcp/ip协议需要设置的参数有哪些
网络协议·tcp/ip·php
苏琢玉20 小时前
用装饰器模式实现多层缓存:让PHP应用更快更稳
php
晴天Y2821 小时前
为php添加额外的功能模块
开发语言·php
网硕互联的小客服1 天前
Linux 系统负载过高的排查思路
linux·服务器·php
硬件进化论1 天前
从基础到实践(十三):无源晶振和有源晶振的应用指南
开发语言·人工智能·php·硬件工程·模块测试
2301_801067091 天前
如何通过修改hosts文件、启动Apache服务器、修改httpd.conf文件、配置虚拟主机、创建站点目录和文件等步骤来配置虚拟主机并发布PHP站点
服务器·php·apache
cskywit1 天前
OpenManus介绍及本地部署体验
开发语言·php