CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。
尤其是在各种第三方接口盛行的时代,各种要求使用curl规范;以下为函数的封装
class Request_curl {
/**
* 封住curl请求方法
* @param { (string) $url } 请求的url
* @param { (array) $post_data } 请求的参数
* @param { (boolean) $ispost } post/get 默认post
* @return { (json) }
*/
public function request($url, $post_data = array(), $ispost = true) {
if (empty($url) || empty($post_data)) {
return false;
}
$o = http_build_query($post_data);
if($ispost){
$url=$url;
// $post_data = http_build_query($post_data);
}else{
$post_data = substr($o,0,-1);
$url = $url.'?'.$post_data;
}
header("Content-type: text/html; charset=utf-8");
//初始化curl
$ch = curl_init();
//抓取指定网页
curl_setopt($ch, CURLOPT_URL,$url);
//设置header
curl_setopt($ch, CURLOPT_HEADER, 0);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($ispost){
//post提交方式
curl_setopt($ch, CURLOPT_POST, 1);
// $post_data为array类型时multipart/formdata请求,string类型时application/x-www-form-urlencoded
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
$data = curl_exec($ch);//运行curl
curl_close($ch);
return $data;
}
}
调用方法十分简单
$post_data = array(
act => 'getUser',
userid => 'aaaaaaa'
);
$url = '';
$result = Request_curl::request($url, $post_data, true/false);
echo $result;
然而面对接收到的文件参数,上传该如何处理呢?本人在调用第三方接口时要求必须为二进制数据;各种获取文件内容,编码解码,上传,接口返回始终是必须返回二进制数据;
$post_data = array(
act => 'saveFile',
fileid => 'aaaaaaa',
content => '文件内容'
);
$url = '';
$result = Request_curl::request($url, $post_data, true/false);
echo $result;
接口返回:
{
"msg": "语音数据错误,应为二进制类型",
"code": 305
}
上传为 ‘@’+路径 也被拒绝;
$post_data = array(
act => 'saveFile',
fileid => 'aaaaaaa',
content => '@./test_data/57921348.speex'
);
$url = '';
$result = Request_curl::request($url, $post_data, true/false);
echo $result;
接口返回:
{
"msg": "语音数据错误,应为二进制类型",
"code": 305
}
其实做到这一步已经是没问题的了,知识被php版本限制,PHP5.6以上版本不在支持这种写法,以下版本这种写法完全没有问题,那么高版本php应该如何处理?
$fs = '/sdzw/www/test_data/57921348.speex';
$speech = new CURLFile(realpath($fs));
$post_data = array(
act => 'saveFile',
fileid => 'aaaaaaa',
content => $speech
);
$url = '';
$result = Request_curl::request($url, $post_data, true/false);
echo $result;
接口返回:
{
"msg": "保存成功",
"code": 200
}
至此,curl函数封装调用以及上传文件已经介绍完成,希望能够帮到小伙伴们;限于本人水平有限,如有错误欢迎大家讨论指正;