0%

curl命令

1、概述

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。
参考文档:https://www.ruanyifeng.com/blog/2019/09/curl-reference.html

2、常用参数

-X

-X 参数指定HTTP请求的方法,不写默认为GET请求

1
2
# 指定 post 请求
$ curl -X POST http://www.example.com

-H

-H 参数添加HTTP请求的标头

1
2
# 添加 Content-Type: application/json 和 Accept-Language: en-US 两个请求标头
$ curl -H 'Accept-Language: en-US' -H 'Content-Type: application/json' http://www.baidu.com

-d/–data-urlencode

-d 参数用于发送 POST 请求的数据体。使用 -d 参数以后,HTTP请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。
–data-urlencode 参数等同于 -d ,发送POST请求的数据体,区别在于会自动将发送的数据进行URL编码。
多个参数可以使用使用多个 -d 参数,也可以使用 & 进行参数拼接。
POST请求发送 json 格式请求体,可以配合使用
-d ‘{“key”, “value”}’ -H ‘Content-Type: application/json’ 。
-d 参数可以读取本地文本文件的数据,向服务器发送。例如使用
-d ‘@/json.txt’ 参数即可使用本地文件json数据。

1
2
3
4
5
6
7
8
9
10
11
12
# 多个参数
$ curl -d 'client_id=c1' -d 'client_secret=secret' -d 'grant_type=refresh_token' -d 'refresh_token=ef059eab-73e0-47d9-bf89-973603ae4551' 'http://localhost:12222/oauth/token'
$ curl -d 'client_id=c1&client_secret=secret&grant_type=refresh_token&refresh_token=ef059eab-73e0-47d9-bf89-973603ae4551' 'http://localhost:12222/oauth/token'

# 发送 json 格式请求体
$ curl -d '{"username": "admin", "password": "123"}' -H 'Content-Type: Application/json' 'http://localhost:8080/passwordLogin'

# 使用本地文件
$ curl -d '@json.txt' 'http://www.example.com'

# URL编码,对username的中文进行URL编码
curl --data-urlencode 'username=张三' --data-urlencode 'password=123' 'http://localhost:8080/form/passwordLogin'

-G

-G 参数用来构造URL的查询字符串,结合-d 参数进行url参数拼接,如果需要进行URL编码使用–data-urlencode 参数
如果不需要URL编码,url拼接更简单的方式是直接使用拼接后的url,用单引号引上即可,例如curl 'http://www.example.com/page/list?pageNum=1&pageSize=10'

1
2
3
4
5
6
# http://www.example.com/page/list?pageNum=1&pageSize=10
$ curl -G -d 'pageNum=1' -d 'pageSize=10' http://www.example.com/page
$ curl 'http://www.example.com/page?pageNum=1&pageSize=10'

# 使用URL编码
curl -G --data-urlencode 'username=张三' --data-urlencode 'password=123' 'http://localhost:8080/query/passwordLogin'

-i

-i 参数打印出服务器响应的 HTTP 标头。收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ curl -i http://www.baidu.com

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 2381
Content-Type: text/html
Date: Sun, 06 Aug 2023 03:25:49 GMT
Etag: "588604c8-94d"
Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

-b

-b 参数用来向服务器发送Cookie
发送多个Cookie,可以使用英文分号;进行分隔
-b 参数后接文件路径,也可以读取本地文件来发送Cookie

1
2
3
4
5
6
7
8
# 生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie
$ curl -b 'foo=bar' http://www.example.com

# 发送两个Cookie
$ curl -b 'foo1=bar1;foo2=bar2' http://www.example.com

# 读取本地文件Cookie
$ curl -b cookie.txt http://www.example.com

-A

-A 参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]
也可以通过 -H 参数直接指定标头,更改User-Agent

1
2
3
# 将用户代理标头改成 Chrome 浏览器
$ curl -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
$ curl -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'

-e

-e 参数用来设置HTTP的标头Referer,表示请求的来源
也可以通过 -H 参数直接指定标头,更改Referer

1
2
3
# 将请求来源设置为google.com
curl -e 'https://google.com?q=example' https://www.example.com
curl -H 'Referer: https://google.com?q=example' https://www.example.com

-o

-o 参数将服务器的回应保存成文件,等同于wget命令,后接参数可以指定文件下载的路径以及名称

1
2
# 将阿里云yum镜像源文件下载到/etc/yum.repos.d/CentOS-Base.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

3、curl简单实践

需求:使用curl命令来实现oauth2.0密码模式获取token,以及使用token发送需要认证的请求。

  • 获取token
  • 使用token来发送需要登录的请求
    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
    28
    29
    30
    31
    32
    33
    34
    # 1.获取access_token
    $ curl -i -d 'username=root' -d 'password=123' -d 'grant_type=password' -d 'client_id=c1' -d 'client_secret=secret' -d 'redirect_uri=http://127.0.0.1:12222/open/sucess' 'http://localhost:12222/oauth/token'

    HTTP/1.1 200
    Cache-Control: no-store
    Pragma: no-cache
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: DENY
    Content-Type: application/json;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Sun, 06 Aug 2023 12:45:50 GMT

    {"access_token":"36f4c522-909b-46a1-a3e7-d15343b8419e","token_type":"bearer","refresh_token":"ba92d79a-2fcd-430d-8a0f-04fd39206195","expires_in":3599,"scope":"all"}


    # 2.携带token访问资源
    curl -i -H 'Authorization: Bearer 36f4c522-909b-46a1-a3e7-d15343b8419e' http://localhost:10000/hello

    HTTP/1.1 200
    Vary: Origin
    Vary: Access-Control-Request-Method
    Vary: Access-Control-Request-Headers
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 1; mode=block
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    X-Frame-Options: DENY
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 108
    Date: Sun, 06 Aug 2023 12:47:37 GMT

    {"success":true,"code":"200","msg":"成功","respTime":"2023-08-06 20:47:37","data":"hello, you have logon"}