// +---------------------------------------------------------------------- namespace crmeb\services; class HttpService { //错误信息 private static $curlError; //header头信息 private static $headerStr; //请求状态 private static $status; /** * @return string */ public static function getCurlError() { return self::$curlError; } /** * @return mixed */ public static function getStatus() { return self::$status; } /** * 模拟GET发起请求 * @param $url * @param array $data * @param bool $header * @param int $timeout * @return bool|string */ public static function getRequest($url, $data = array(), $header = false, $timeout = 10) { if (!empty($data)) { $url .= (stripos($url, '?') === false ? '?' : '&'); $url .= (is_array($data) ? http_build_query($data) : $data); } return self::request($url, 'get', array(), $header, $timeout); } /** * curl 请求 * @param $url * @param string $method * @param array $data * @param bool $header * @param int $timeout * @return bool|string */ public static function request($url, $method = 'get', $data = array(), $header = false, $timeout = 15) { self::$status = null; self::$curlError = null; self::$headerStr = null; $method = strtoupper($method); if ($method == 'GET' && !empty($data)) $url .= "?". http_build_query($data); $curl = curl_init($url); //请求方式 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); //post请求 if ($method == 'POST') curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //超时时间 curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置header头 if ($header !== false) curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_FAILONERROR, false); //返回抓取数据 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //输出header头信息 curl_setopt($curl, CURLOPT_HEADER, true); //TRUE 时追踪句柄的请求字符串,从 PHP 5.1.3 开始可用。这个很关键,就是允许你查看请求header curl_setopt($curl, CURLINFO_HEADER_OUT, true); //https请求 if (1 == strpos("$" . $url, "https://")) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); } self::$curlError = curl_error($curl); list($content, $status) = [curl_exec($curl), curl_getinfo($curl), curl_close($curl)]; self::$status = $status; self::$headerStr = trim(substr($content, 0, $status['header_size'])); $content = trim(substr($content, $status['header_size'])); return (intval($status["http_code"]) === 200) ? $content : false; } /** * 模拟POST发起请求 * @param $url * @param array $data * @param bool $header * @param int $timeout * @return bool|string */ public static function postRequest($url, array $data = array(), $header = false, $timeout = 10) { return self::request($url, 'post', $data, $header, $timeout); } /** * 获取header头字符串类型 * @return mixed */ public static function getHeaderStr() { return self::$headerStr; } /** * 获取header头数组类型 * @return array */ public static function getHeader() { $headArr = explode("\r\n", self::$headerStr); return $headArr; } }