curl 发送 HTTP 请求
没错, 就是你想到的那个命令:
curl
PHP curl 相关方法文档: https://www.php.net/manual/zh/book.curl.php
php
<?php
// 1.初始化 curl 会话, $curl 是一个资源类型的句柄
$curl = curl_init();
// 2.设置 curl 相关选项
// https://www.php.net/manual/zh/curl.constants.php
$api_url = 'https://echo.apifox.com/get';
$options = [
CURLOPT_URL => $api_url, // 请求地址
CURLOPT_CUSTOMREQUEST => 'GET', // 请求方式
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, // 请求使用的 HTTP版本, 默认为 HTTP/1.1
CURLOPT_RETURNTRANSFER => true, // 将 curl_exec 获取的信息以 string 返回,而不是直接输出
CURLOPT_TIMEOUT => 10, // 请求超时时间, 单位秒
];
curl_setopt_array($curl, $options);
// 3.发送请求获得响应(同步阻塞)
$response = curl_exec($curl);
// 4.关闭会话
curl_close($curl);
// 5.查看响应新消息
echo "<pre>";
var_dump($response);
echo "</pre>";
// 输出信息如下: 发现是一个 JSON 格式的字符串
// string(344) "{
// "args": {},
// "headers": {
// "Accept": "*/*",
// "Accept-Encoding": "deflate, gzip, br, zstd",
// "Connection": "close",
// "Host": "echo.apifox.com",
// "Remoteip": "110.53.80.48",
// "X-Real-Ip-2": "110.53.80.48",
// "X-Real-Ip-Ai": "110.53.80.48"
// },
// "origin": "110.53.80.48",
// "url": "http://echo.apifox.com/get"
// }
// "json 编码/解码
JSON 编码/解码扩展方法: https://www.php.net/manual/zh/book.json.php
php
<?php
echo "<pre>";
$arr = [
"id" => 1001,
"name" => "张三",
"email" => "zhang3@example.com",
"is_boy" => true,
];
$str1 = json_encode($arr); # 默认会将中文编码为unicode
$str2 = json_encode($arr, JSON_UNESCAPED_UNICODE); # 不要将中文编码为 unicode
echo $str1; // {"id":1001,"name":"\u5f20\u4e09","email":"zhang3@example.com","is_boy":true}
echo "<hr/>";
echo $str2; // {"id":1001,"name":"张三","email":"zhang3@example.com","is_boy":true}
echo "<hr/>";
$arr2 = ['a', 'b', 'c'];
$str3 = json_encode($arr2);
echo $str3; // ["a","b","c"]
echo "<hr/>";
echo "</pre>";php
<?php
echo "<pre>";
$str = '[1,2,3]';
$arr = json_decode($str);
print_r($arr);
/*
Array
(
[0] => 1
[1] => 2
[2] => 3
)
*/
echo "<hr/>";
$str1 = '{"id":1001,"name":"\u5f20\u4e09","email":"zhang3@example.com","is_boy":true}';
$obj1 = json_decode($str1);
print_r($obj1);
/*
stdClass Object
(
[id] => 1001
[name] => 张三
[email] => zhang3@example.com
[is_boy] => 1
)
*/
echo "<hr/>";
$str2 = '{"id":1001,"name":"李四","email":"li4@example.com","is_boy":true}';
$list = json_decode($str2, true);
print_r($list);
/*
默认情况下:
字符串中内容描述的是数组(str1) 那么解析到php就是一个数组($arr)
如果字符串中内容描述的是对象(str2) 那么解析到php就是一个对象($obj1)
但是可以用常量来设置解析后的值是什么类型:
JSON_OBJECT_AS_ARRAY: 将 JSON 对象字符串作为数组解码
JSON_FORCE_OBJECT: 使一个非关联数组输出一个类实例(Object)而非数组
Array
(
[id] => 1001
[name] => 李四
[email] => li4@example.com
[is_boy] => 1
)
*/
echo "</pre>";curl 发送请求并将数据解析为 PHP 数组
php
<?php
$curl = curl_init();
$api_url = 'https://echo.apifox.com/get';
$options = [
CURLOPT_URL => $api_url, // 请求地址
CURLOPT_CUSTOMREQUEST => 'GET', // 请求方式
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, // 请求使用的 HTTP版本, 默认为 HTTP/1.1
CURLOPT_RETURNTRANSFER => true, // 将 curl_exec 获取的信息以 string 返回,而不是直接输出
CURLOPT_TIMEOUT => 10, // 请求超时时间, 单位秒
];
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
echo "<pre>";
print_r($data);
echo "</pre>";
/*
Array
(
[args] => Array
(
)
[headers] => Array
(
[Accept] => **
[Connection] => close
[Host] => echo.apifox.com
[Remoteip] => 110.53.80.48
[X-Real-Ip-2] => 110.53.80.48
[X-Real-Ip-Ai] => 110.53.80.48
)
[origin] => 110.53.80.48
[url] => http://echo.apifox.com/get
)
*/
echo "<hr/>";
echo $data["url"]; // http://echo.apifox.com/get