PHP请求客户端Guzzle、Curl

guzzle 安装

composer guzzlehttp/guzzle

文档: https://guzzle-cn.readthedocs.io/zh_CN/latest/

guzzle post demo

// client
include 'vendor/autoload.php';

$client = new \GuzzleHttp\Client();

$params = [
    "headers"=> [
         'Accept'=>"application/json",
         //'Content-Type'=>"application/json",
         'Authorization'=>md5("tokenad&cd&xxx")
    ],
    // form表单
    "form_params"=>[
        "username"=>"laozhou",
        "password"=>"laozhou123",
    ],
];
$url = 'http://localhost/guzzle_post_server.php';
$response = $client->request("post",$url,$params);
echo '<pre>';
var_dump($response->getBody()->getContents());
var_dump($response->getStatusCode());
var_dump($response->getHeader("Content-Type"));
var_dump($response->getHeader('Content-Length'));

// server
$arr = [
    "code" => 0,
    "msg" => 'ok',
    "data" => $_POST,
];
header("Content-Type: application/json;charset=utf-8");
echo \json_encode($arr,JSON_UNESCAPED_UNICODE);

post请求设置body

// client
include 'vendor/autoload.php';
$client = new \GuzzleHttp\Client();
$data = [
    "username"=>"laozhou",
    "password"=>"laozhou123",
];
$params = [
    "headers"=> [
         'Accept'=>"application/json",
         'Content-Type'=>"application/json",
         'Authorization'=>md5("tokenad&cd&xxx"),
    ],
    'body'=>json_encode($data,JSON_UNESCAPED_UNICODE)
];
$url = 'http://localhost/guzzle_post_server.php';
$response = $client->request("post",$url,$params);
echo $response->getBody()->getContents();

// server
$body = file_get_contents("php://input");
$arr = [
    "code" => 1,
    "msg" => 'params error',
    "data" => $body,
];
header("Content-Type: application/json;charset=utf-8");
echo \json_encode($arr,JSON_UNESCAPED_UNICODE);



Guzzle get

//client 

include 'vendor/autoload.php';

$client = new \GuzzleHttp\Client();

$params = [
    "headers"=> [
         'Accept'=>"application/json,text/plain,test/html",
        'Authorization'=>md5("token ad&cd&lll")
    ],
];
$url = 'http://localhost/demo01.php/?name=sb&age=25';
$response = $client->request("post",$url,$params);
echo '<pre>';
var_dump($response->getBody()->getContents());
var_dump($response->getStatusCode());
var_dump($response->getHeader("Content-Type"));


// server
$arr = [
    "code" => 1,
    "msg" => 'params error',
    "data" =>$_GET,
];
// 这里设置的header头部信息,浏览器请求: 响应信息可以看到,但是guzzle且看不懂
header("Content-Type: text/plain;charset=utf-8");
echo \json_encode($arr,JSON_UNESCAPED_UNICODE);

guzzle 可以设置请求超时时间,还可以发送异步请求

Curl

// 可以设置自定义header头部
// 可以设置超时时间
// 可以自定义请求方法
// curl_exec  成功时返回true,失败时返回false ,CURLOPT_RETURNTRANSFER 被设置为true,则函数执行成功时返回执行的结果,失败时返回false
// 获取错误信息函数 curl_error() curl_errno() curl_getinfo();

// http get 
function curlGet01($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 500);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    $res = curl_exec($ch);
    curl_close($ch);

    return $res;
}

// http post

function curlPost01($url, $post_data, $header = [], $timout = 15)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timout);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    if ($header) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    if (stripos($url, "https") !== false) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    }
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}



// post client request 
$url = "http://localhost/demo.php";
$post_data = ["username"=>"ncsb","token"=>md5("abd&123ddddxxx")];
$header = ["Content-Type" => "application/json",];
$post_data_str = json_encode($post_data);
$result = curlPost01($url, $post_data_str, $header,30);
var_dump($result);

// post server 
$body = file_get_contents("php://input");
$arr = [
    "code" => 0,
    "msg" => 'ok',
    "data" => $body,
];
header("Content-Type: application/json;charset=utf-8");
echo \json_encode($arr,JSON_UNESCAPED_UNICODE);

ps:

表单get提交:Payload query string parameters, 参数拼接到请求的url后面 : username=ddd&pwd=ddd
表单post提交 Payload form data, 表单post提交默认的Content-Type:application/x-www-form-urlencoded,参数也是拼接成username=ddd&pwd=ddd 来传输的
表单提交,带有附件的提交,设置 enctype="multipart/form-data"

- form-data   multipart/form-data  文件上传表单类型
--header 'Content-Type: multipart/form-data; boundary=--------------------------299043408196458162695418' \
--form 'c="1"' \
--form 'd="2"'

- x-www-form-urlencoded   application/x-www-form-urlencoded   表单提交文件的默认类型
--data-urlencode 'c=1' \
--data-urlencode 'd=2'

- json 
--data-raw '{
    "zq":"sb",
    "nc":"sb01"
}'

curl 参数选项

          $option = [
            CURLOPT_HEADER => 0,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_CONNECTTIMEOUT => 60,
            CURLOPT_DNS_CACHE_TIMEOUT => 1800,
            CURLOPT_FORBID_REUSE => 1,
            CURLOPT_FRESH_CONNECT => 1,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
            CURLOPT_ENCODING => 'gzip,deflate',
            CURLINFO_HEADER_OUT => true,//curl info里面能看到请求的头部
            CURLOPT_RETURNTRANSFER => true,
        ];
 //  curl_setopt 单个设置选项
   curl_setopt($ch, CURLOPT_TIMEOUT, 30);

 // curl_setopt_array 多个设置选项 
 curl_setopt_array($ch,$option)

curl错误

https://www.php.cn/js-tutorial-379132.html 错误码说明
https://blog.csdn.net/wjb123sw99/article/details/103946046

  /**
     * 获取curl错误码
     * @param $code
     * @return mixed|string
     */
 function geErrorMsg($code)
    {
        $errorCodes =
            [
                1 => 'CURLE_UNSUPPORTED_PROTOCOL',
                2 => 'CURLE_FAILED_INIT',
                3 => 'CURLE_URL_MALFORMAT',
                4 => 'CURLE_URL_MALFORMAT_USER',
                5 => 'CURLE_COULDNT_RESOLVE_PROXY',
                6 => 'CURLE_COULDNT_RESOLVE_HOST',
                7 => 'CURLE_COULDNT_CONNECT',
                8 => 'CURLE_FTP_WEIRD_SERVER_REPLY',
                9 => 'CURLE_REMOTE_ACCESS_DENIED',
                11 => 'CURLE_FTP_WEIRD_PASS_REPLY',
                13 => 'CURLE_FTP_WEIRD_PASV_REPLY',
                14 => 'CURLE_FTP_WEIRD_227_FORMAT',
                15 => 'CURLE_FTP_CANT_GET_HOST',
                17 => 'CURLE_FTP_COULDNT_SET_TYPE',
                18 => 'CURLE_PARTIAL_FILE',
                19 => 'CURLE_FTP_COULDNT_RETR_FILE',
                21 => 'CURLE_QUOTE_ERROR',
                22 => 'CURLE_HTTP_RETURNED_ERROR',
                23 => 'CURLE_WRITE_ERROR',
                25 => 'CURLE_UPLOAD_FAILED',
                26 => 'CURLE_READ_ERROR',
                27 => 'CURLE_OUT_OF_MEMORY',
                28 => 'CURLE_OPERATION_TIMEDOUT',
                30 => 'CURLE_FTP_PORT_FAILED',
                31 => 'CURLE_FTP_COULDNT_USE_REST',
                33 => 'CURLE_RANGE_ERROR',
                34 => 'CURLE_HTTP_POST_ERROR',
                35 => 'CURLE_SSL_CONNECT_ERROR',
                36 => 'CURLE_BAD_DOWNLOAD_RESUME',
                37 => 'CURLE_FILE_COULDNT_READ_FILE',
                38 => 'CURLE_LDAP_CANNOT_BIND',
                39 => 'CURLE_LDAP_SEARCH_FAILED',
                41 => 'CURLE_FUNCTION_NOT_FOUND',
                42 => 'CURLE_ABORTED_BY_CALLBACK',
                43 => 'CURLE_BAD_FUNCTION_ARGUMENT',
                45 => 'CURLE_INTERFACE_FAILED',
                47 => 'CURLE_TOO_MANY_REDIRECTS',
                48 => 'CURLE_UNKNOWN_TELNET_OPTION',
                49 => 'CURLE_TELNET_OPTION_SYNTAX',
                51 => 'CURLE_PEER_FAILED_VERIFICATION',
                52 => 'CURLE_GOT_NOTHING',
                53 => 'CURLE_SSL_ENGINE_NOTFOUND',
                54 => 'CURLE_SSL_ENGINE_SETFAILED',
                55 => 'CURLE_SEND_ERROR',
                56 => 'CURLE_RECV_ERROR',
                58 => 'CURLE_SSL_CERTPROBLEM',
                59 => 'CURLE_SSL_CIPHER',
                60 => 'CURLE_SSL_CACERT',
                61 => 'CURLE_BAD_CONTENT_ENCODING',
                62 => 'CURLE_LDAP_INVALID_URL',
                63 => 'CURLE_FILESIZE_EXCEEDED',
                64 => 'CURLE_USE_SSL_FAILED',
                65 => 'CURLE_SEND_FAIL_REWIND',
                66 => 'CURLE_SSL_ENGINE_INITFAILED',
                67 => 'CURLE_LOGIN_DENIED',
                68 => 'CURLE_TFTP_NOTFOUND',
                69 => 'CURLE_TFTP_PERM',
                70 => 'CURLE_REMOTE_DISK_FULL',
                71 => 'CURLE_TFTP_ILLEGAL',
                72 => 'CURLE_TFTP_UNKNOWNID',
                73 => 'CURLE_REMOTE_FILE_EXISTS',
                74 => 'CURLE_TFTP_NOSUCHUSER',
                75 => 'CURLE_CONV_FAILED',
                76 => 'CURLE_CONV_REQD',
                77 => 'CURLE_SSL_CACERT_BADFILE',
                78 => 'CURLE_REMOTE_FILE_NOT_FOUND',
                79 => 'CURLE_SSH',
                80 => 'CURLE_SSL_SHUTDOWN_FAILED',
                81 => 'CURLE_AGAIN',
                82 => 'CURLE_SSL_CRL_BADFILE',
                83 => 'CURLE_SSL_ISSUER_ERROR',
                84 => 'CURLE_FTP_PRET_FAILED',
                84 => 'CURLE_FTP_PRET_FAILED',
                85 => 'CURLE_RTSP_CSEQ_ERROR',
                86 => 'CURLE_RTSP_SESSION_ERROR',
                87 => 'CURLE_FTP_BAD_FILE_LIST',
                88 => 'CURLE_CHUNK_FAILED',
            ];
        return $errorCodes[$code] ?? 'fail';
    }

curl retry

重试机制: 什么情况下重试?

请求失败curl返回为false,还是根据http status 是否为200,304 。。。还是匹配的内容里面是否有关键字
https://cloud.tencent.com/developer/article/1581200
https://www.yisu.com/zixun/344331.html

//  retry ,retry-delay 


....

$data_json = json_encode($data);

$result = null;
for ($i = 1; $i <= 3; $i++) {
  
    $result = Curl::post($api, $data, $opt, $error_msg);

    $curl_info = Curl::$curl_info;
    // 这样判定重试的机制,是根据请求的接口网络不稳定
    if ($curl_info['http_code'] === 0) {
        sleep(1);
        continue;
    }
    break;
} 
...

other

// 下载图片检查是否失败。。 很多网站js会显示状态码304,使用到了缓存
in_array($curl_info['http_code'], array(200, 304)) && $res    
posted @   ncsb  阅读(1020)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示