PHP整合CURL发送HTTP请求的Model(包括文件发送)
php进行API请求使用curl是肯定的,之前更多的是整合到一个全局函数中,直接调用。
一、需求
将PHP CURL HTTP 请求整合成Model,包括的功能:
- 发送 HTTP GET 请求
- 发送 HTTP POST 请求 (仅数据)
- 发送 HTTP POST 请求 (携带文件)
PHP CURL 文档地址:
二、关键点
今天搞了挺久的文件发送,之前都是使用 '@'.$path 来表明发送文件。
PHP 5.5 之后需要使用 CURLFile() 的对象来替代传统的 @ 表明文件的方式
使用 CURLFile() 有两种方式:
- 使用 curl_file_create($path,$mime,$postName) 这个函数来构建对象
- 直接 new CURLFile($path,$mime,$postName) 来实例化对象
两种方法都可以,唯一需要注意的一点是:
$path 是需要 **绝对路径** 的,如果不是本地绝对路径,则需要使用 <red>readlpath($path) 来构造成绝对路径。
三、Model代码
<?php
/**
* Author: Postbird
* Date : 2017/5/30
* time : 20:00
* Site : www.ptbird.cn
* There I am , in the world more exciting!
*/
namespace app\index\model;
use think\Model;
class CurlHttp extends Model{
/**
* 通过curl发送http post 请求
* - $header 数组形式 $header=['Content-Type:text/json','Authorization:xxxxxxx'];
* - $data 数组形式 $data=['param'=>$value];
* @param $url string
* @param $header array
* @param $data array
* @return array
*/
public function curlPost($url,$header,$data){
try{
$ch = curl_init();
if (substr($url, 0, 5) == 'https') {
// 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 从证书中检查SSL加密算法是否存在
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);// 设置请求的url
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);// 设置请求的HTTP Header
// 设置允许查看请求头信息
// curl_setopt($ch,CURLINFO_HEADER_OUT,true);
curl_setopt($ch, CURLOPT_POST, true);// 请求方式是POST
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));// 设置发送的data
$response = curl_exec($ch);
// 查看请求头信息
// dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
if ($error = curl_error($ch)) {
// 如果发生错误返回错误信息
curl_close($ch);
$ret=['status'=>false,'msg'=>$error];
return $ret;
} else {
// 如果发生正确则返回response
curl_close($ch);
$ret=['status'=>true,'msg'=>$response];
return $ret;
}
}catch (\Exception $exception){
$ret=['status'=>false,'msg'=>$exception->getMessage()];
return $ret;
}
}
/**
* 发送http POST请求 部分内容需要发送文件
* - 发送文件中 CURLOPT_POSTFIELDS 没有使用 http_build_query()
* - 如果只是发送数据请求不传送文件,使用 http_build_query()可以减少发送请求数据包大小
* $data 数据构造 $data['fileParam'=>curl_file_create($path,'image/jpeg'),'fileParam2'=>curl_file_create($path,'image/jpeg')]
* - path 必须是绝对路径,如果不是绝对路径必须使用 realpath($path)使用
* @param $url
* @param $header
* @param $data
* @return array
*/
public function curlPostWithFile($url,$header,$data){
try{
$ch = curl_init();
if (substr($url, 0, 5) == 'https') {
// 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 从证书中检查SSL加密算法是否存在
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);// 设置请求的url
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);// 设置请求的HTTP Header
// 设置允许查看请求头信息
// curl_setopt($ch,CURLINFO_HEADER_OUT,true);
curl_setopt($ch, CURLOPT_POST, true);// 请求方式是POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);// 设置发送的data 使用的 multipart/form-data
$response = curl_exec($ch);
// 查看请求头信息
// dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
if ($error = curl_error($ch)) {
// 如果发生错误返回错误信息
curl_close($ch);
$ret=['status'=>false,'msg'=>$error];
return $ret;
} else {
// 如果发生正确则返回response
curl_close($ch);
$ret=['status'=>true,'msg'=>$response];
return $ret;
}
}catch (\Exception $exception){
$ret=['status'=>false,'msg'=>$exception->getMessage()];
return $ret;
}
}
/**
* 发送http get请求
* @param $url
* @param $header
* @param $data
* @return array
*/
public function curlGet($url,$header,$data){
try{
$ch = curl_init();
if (substr($url, 0, 5) == 'https') {
// 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 从证书中检查SSL加密算法是否存在
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);// 设置请求的url
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);// 设置请求的HTTP Header
// 设置允许查看请求头信息
// curl_setopt($ch,CURLINFO_HEADER_OUT,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));// 设置发送的data 使用的 multipart/form-data
$response = curl_exec($ch);
// 查看请求头信息
// dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
if ($error = curl_error($ch)) {
// 如果发生错误返回错误信息
curl_close($ch);
$ret=['status'=>false,'msg'=>$error];
return $ret;
} else {
// 如果发生正确则返回response
curl_close($ch);
$ret=['status'=>true,'msg'=>$response];
return $ret;
}
}catch (\Exception $exception){
$ret=['status'=>false,'msg'=>$exception->getMessage()];
return $ret;
}
}
}