php进行API请求使用curl是肯定的,之前更多的是整合到一个全局函数中,直接调用。

curl.jpg

一、需求

将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;
        }
    }
}