Skip to content

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

Released under the MIT License.