cURL 使用指南

终端

我们可以在这里查看到更多关于 curl 命令的参数解释,本文仅覆盖日常的一些使用场景。

GET

如果要发起简单的 GET 请求,只需直接请求地址即可。

1
$ curl https://cn.bing.com/HPImageArchive.aspx\?format\=js\&idx\=0\&n\=1\&nc\=1572500909531\&pid\=hp\&FORM\=BEHPTB\&video\=1 | jq

我们使用jq来使 json 数据在终端格式化展示。

POST

下载

参数 说明
-o 将结果写入指定文件
-O 直接以远程文件名保存到本地
-# 显示下载进度条
-s 将终端的输出关闭
-v 输出详细的请求
-C 断点续传
–limit-rate 设置传输速度(默认单位为 B/s,手动添加 kmg 指定单位)
–retry 5 传输出现问题时,重试 5 次
–retry-delay 传输出现问题时,设置重试时间间隔 (秒)
–retry-max-time 传输出现问题时,设置最大重试时间
-m 设置最大传输时间,单位秒

保存结果
保存结果

输出详细请求信息
输出详细请求过程

请求

参数 说明
-H 设定 header 信息
-d/--data 对应Content-Type:application/x-www-form-urlencoded
-F 对应Content-Type:multipart/form-data,可用于指定上传文件的路径
-G 使用 GET 方式发送数据
-I 只显示请求头信息
-x 使用 http 代理
-A 设置 User-Agent 信息
-e 设置 Referer 信息
--cookie 设置 cookie 信息,多个 cookie 用分号分隔,分号后带一个空格
1
2
3
4
5
6
7
8
9
$ curl 'https://open.unionpay.com/tjwx/api/cardbin/cardinfo' \
-H 'Content-Type:application/x-www-form-urlencoded' \
-H 'Accept:application/json, text/javascript, */*; q=0.01' \
-e 'https://open.unionpay.com/tjwx/openapi/cardbin-pc.html' \
-A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36' \
-d 'cardNo=6227000280070859140' \
--cookie 'fruit=apple; colour=red' \
-s \
| jq

最后,如果本地没有安装 Postman 等图形化请求工具,还可以直接打开浏览器的控制台,获取到某次网络的 curl 形式,这样在调试某些页面请求或者忘记 curl 的请求格式时可以用到。

更多终端使用教程请查看curl tutorial

还有一个终端 HTTP 请求工具HTTPie会比 curl 更加友好,支持自动 json 格式化,可以尝试一下。

PHP

GET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$url = 'https://cn.bing.com/HPImageArchive.aspx?';
$query = http_build_query([
'format' => 'js',
'idx' => 0,
'n' => 1,
'nc' => 1572500909531,
'pid' => 'hp',
'FORM' => 'BEHPTB',
'video' => 1,
]);

$ch = curl_init($url . $query);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$res = curl_exec($ch);

curl_close($ch);

通常,一个简单的 GET 请求,我们可以用file_get_contents()更快速的获取结果。

POST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$ch = curl_init('https://open.unionpay.com/tjwx/api/cardbin/cardinfo');

curl_setopt_array(
$ch,
[
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['cardNo' => $cardNo]),//设定 POST 参数内容
CURLOPT_FOLLOWLOCATION => true,//跟随重定向地址
CURLOPT_AUTOREFERER => true,
CURLOPT_RETURNTRANSFER => true,//将curl_exec()获取的信息以字符串返回,而不是直接输出。
CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
CURLOPT_REFERER => 'https://open.unionpay.com/tjwx/openapi/cardbin-pc.html',//必填项
CURLOPT_HTTPHEADER => ["Content-Type: application/x-www-form-urlencoded", "Accept: application/json, text/javascript, */*; q=0.01"]
]
);

$response = curl_exec($ch);

curl_close($ch);

需要注意的几点:

  1. curl_setopt_array中的第二个参数的 key 为预设常量,不要写作字符串
  2. 若未设置CURLOPT_RETURNTRANSFER = true,则 curl 会默认输出结果,这个问题我调了一个下午😅
  3. 在调用 curl 结束后,记得调用curl_close()关闭句柄,为了防止遗忘,建议curl_init()curl_close()成对创建
  4. 如果有多个互不依赖的请求,可以使用curl_multi来提升加载速度,使用示例如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
// build the individual requests, but do not execute them
$ch_1 = curl_init('http://webservice.one.com/');
$ch_2 = curl_init('http://webservice.two.com/');
curl_setopt($ch_1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_2, CURLOPT_RETURNTRANSFER, true);

// build the multi-curl handle, adding both $ch
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch_1);
curl_multi_add_handle($mh, $ch_2);

// execute all queries simultaneously, and continue when all are complete
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

// all of our requests are done, we can now access the results
$response_1 = curl_multi_getcontent($ch_1);
$response_2 = curl_multi_getcontent($ch_2);
echo "$response_1 $response_2"; // output results

更多请求参数设置请点击curl_setop查看。


参考资料

  1. cURL - Offical Website
  2. Client URL 库 - PHP Manual
因为热爱,所以执着。