终端
我们可以在这里 查看到更多关于 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,手动添加 k,m,g 指定单位)
–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 );
需要注意的几点:
curl_setopt_array中的第二个参数的 key 为预设常量,不要写作字符串
若未设置CURLOPT_RETURNTRANSFER = true,则 curl 会默认输出结果,这个问题我调了一个下午😅
在调用 curl 结束后,记得调用curl_close()关闭句柄,为了防止遗忘,建议curl_init()与curl_close()成对创建
如果有多个互不依赖的请求,可以使用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 $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 ); $mh = curl_multi_init ();curl_multi_add_handle ($mh , $ch_1 );curl_multi_add_handle ($mh , $ch_2 ); $running = null ; do { curl_multi_exec ($mh , $running ); } while ($running ); curl_multi_remove_handle ($mh , $ch1 );curl_multi_remove_handle ($mh , $ch2 );curl_multi_close ($mh ); $response_1 = curl_multi_getcontent ($ch_1 );$response_2 = curl_multi_getcontent ($ch_2 );echo "$response_1 $response_2 " ;
更多请求参数设置请点击curl_setop 查看。
参考资料
cURL - Offical Website
Client URL 库 - PHP Manual