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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?