• Linux


    背景

    • 看到开发都是用这个命令来调接口,我也跟着用了
    • 的确很方便,有时候你要跟开发讲某个接口可能有问题的时候,总不能每次都截图吧,这样可信力也不高
    • 所以写 curl 调接口是最快的,直接让开发复制粘贴执行一遍,就知道接口的确有问题了

    curl 介绍

    • curl 是常用的命令行工具,用来请求 Web 服务器
    • 它的名字就是客户端(client)的 URL 工具的意思
    • 它的功能非常强大,命令行参数多达几十种
    • 如果熟练的话,完全可以取代 Postman 接口测试工具

    官方文档

    https://curl.se/docs/manpage.html

     

    支持的协议

    • DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS
    • IMAP、IMAPS、LDAP、LDAP、POP3、POP3、RTMP、RTSP、SCP、SFTP、SMB
    • SMBS、SMTP、SMTPS、TELNET、TFTP

    提供强大的功能

    • 代理支持
    • 用户身份验证
    • FTP上传
    • httppost
    • SSL连接
    • cookies
    • 文件传输恢复
    • Metalink
    • 等等

    语法格式

    curl [options / URLs]

    URL 的各种传法

    仅做拓展,实际工作感觉不一定会用的上

    大括号 { } 

     http://site.{1,2,3}.com 

    等价于发了请求了三个 host

    http://site.1.com
    http://site.2.com
    http://site.3.com

    中括号 [ ] 获得字母数字序列

    类似 range(1,100)

    ftp://ftp.example.com/file[1-100].txt文件  # 100个请求
    ftp://ftp.example.com/file[001-100].txt(带0) # 100个请求
    ftp://ftp.example.com/file[a-z].txt文件  # 26个请求

    注意:不支持嵌套序列,但可以在每个序列旁边使用多个嵌套序列

    综合使用

    http://example.com/archive[1996-1999]/vol[1-4]/第{a,b,c}部分.html

    [ ] 结合 步进

    http://example.com/file[1-100:10].txt文件    # 每10个取一次,总共10个请求    
    http://example.com/file[a-z:2].txt文件    # 每2个取一次,总共13个请求

      

    常见参数

    不带参数

    请求网页地址

    https://www.cnblogs.com/poloyy/

    返回的是网页的 html 源码

    如果是一个正常的 get 请求 

    注意

    后面的栗子,基本都会加 -v,是为了看请求的详细过程,更容易看到对应的参数已生效,实际使用不需要每次都 -v

    -A

    • 等价参数: --user-agent <name> 
    • 作用:指定客户端的 User-Agent
    curl -v -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" http://baidu.com

    -b

    • 等价参数: --cookie <data|file>
    • 作用:向服务器发送 Cookie,可以是 data 也可以是一个文件
    curl -v -b 'foo=bar' http://baidu.com

    Request Headers 将会生成一个Cookie: foo=bar,向服务器发送一个名为 foo、值为 bar 的 Cookie

    通过打印详细信息,可以看到请求头的确加了

    -c

    • 等价参数: --cookie-jar <filename>
    • 作用:将服务器返回需要设置的 Cookie 写入一个文件
    curl -k -v -c test.txt https://www.baidu.com/s?wd=123%E8%89%BE%E5%BE%B7&rsv_spt=1&rsv_iqid=0xf0b9806f0000107b&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=6&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=1138&rsv_sug4=1138

    会将百度响应需要设置的 Cookie 写入 test.txt 文件

    -d(常用)

    • 等价参数: --data <data>
    • 作用:用于发送 POST 请求的数据体
    curl -v  -d 'wd=biying' -d 'ie=UTF-8'  https://www.baidu.com/s

    • Http 请求头会自动加上 Content-Type : application/x-www-form-urlencoded
    • 并且会自动将请求转为 POST 方法,因此可以省略-X POST

    --data-urlencode(常用)

    作用:参数等同于 -d,发送 POST 请求的数据体,但它会自动将发送的数据进行 URL 编码

    curl -v -G --data-urlencode 'wd=b i y i n g' -d 'ie=UTF-8'  https://www.baidu.com/s

    会将空格进行 URL 编码

    curl -v -G -d 'wd=b i y i n g' -d 'ie=UTF-8'  https://www.baidu.com/s

    -d 就不会 url 编码

    --data-raw(常用)

    作用:POST 请求体,可以接收一个完整的 json 字符串

    curl --location --request POST 'http://test.com/account.login?ver=1.0&df=json&cver=3.7.8&os=android' 
    --header 'Content-Type: application/json' 
    --data-raw '{
        "id":"123",
        "service":"account.login",
        "client":{
            "ve":"3.7.8",
            "os":"android",
            "si":"123",
            "ex":{
                "brand":"vivo",
                "dpfr":"8.1.0",
            },
            "empty":false
        },
        "data":{
            "ex":{
                "token":"123"
            }
        }
    }'

    -e

    • 价参数: --referer <URL>
    • 作用:设置 HTTP Headers 里面的 Referer,表示请求的来源
    curl -v -e "test" http://baidu.com

    -F

    • 等价参数: --form <name=content>
    • 作用:向服务器上传二进制文件
    curl -F 'file=@photo.png' https://google.com/profile 

    自动给 HTTP Request Headers 加上 Content-Type: multipart/form-data ,然后将文件 photo.png 作为 file 字段的值上传

    指定 MIME 类型

    curl -F 'file=@photo.png;type=image/png' https://google.com/profile

    指定 MIME 类型为 image/png ,否则 curl 会把 MIME 类型设为 application/octet-stream 

    指定文件名

    curl -F 'file=@photo.png;filename=me.png' https://google.com/profile

    服务器接收到的文件名为 me.png 

    -G

    • 等价参数: --get
    • 作用:构造 URL 的查询字符串
    curl -v -G -d 'wd=biying' -d 'ie=UTF-8'  https://www.baidu.com/s

     

    本来 -d 会让 HTTP 请求变成 POST,但因为加了 -G,仍然是 GET,因为是查询字符串

    -H(常用)

    • 等价参数: --header <header/@file>
    • 作用:添加 HTTP 请求头
    curl -v -H "token:123" -H "Content-type:application/json" http://baidu.com

    -H 指定两个请求头字段,都加上了

    -i

    • 等价参数: --include
    • 作用:打印 Responses Headers 和响应内容
    curl  -i http://baidu.com

    -I

    • 等价参数: ---head
    • 作用:仅打印 Responses Headers
    curl  -I http://baidu.com

    -k

    • 等价参数: --insecure
    • 作用:跳过 SSL 检测 
    curl -k -I https://www.baidu.com

    目测不加也能正常发起 HTTPS 的请求

    -L

    • 等价参数: --location
    • 作用:让 HTTP 请求跟随服务器的重定向,curl 默认不跟随重定向
    curl -L -d 'tweet=hi' https://api.twitter.com/tweet

    建议都加上

    --limit-rate

    作用:限制 HTTP 请求和回应的带宽,模拟慢网速的环境

    curl -v --limit-rate 2k http://baidu.com

    将带宽限制在每秒 2K 字节

    但我测试了下,感觉比较鸡肋,还是瞬间完成请求

    -o

    • 等价参数: --output <file>
    • 作用:将服务器的 Responses 保存成文件,等同于 wget 命令
    curl -o baidu.html  http://baidu.com

    -O

    • 等价参数: --remote-name
    • 作用:将服务器 Responses 保存成文件,并将 URL 的最后部分当作文件名

    -s

    • 等价参数: --silent
    • 作用:静默模式,将不输出错误和进度信息,不发生错误的话,会正常显示运行结果

    -S

    • 等价参数: --show-error
    • 作用:只输出错误信息,会让 -s 参数不生效

    常用组合技

    curl -S -s https://google.com/login

    如果正确,则正常输出,如果错误则只输出错误信息,不输出运行结果

    -u

    • 等价参数: --user <user:password>
    • 作用:设置服务器认证的用户名和密码
    curl -u 'bob:12345' https://google.com/login

    -v

    • 等价参数: --verbose
    • 作用:输出通信的整个过程,用于调试

    一路都是栗子,不再举栗子

    --trace

    作用:输出通信的整个过程,比 -v 更详细

    不举栗子,因为是 16 进制的数据结果,直接看下面的 --trace-ascii,用法一样,输出的数据也一样,但是是用 10 进制显示

    --trace-ascii

    作用:输出通信的整个过程,比 -v 更详细,但没有十六进制输出,而是十进制

    终极实际工作的栗子

    为了更全面的看到请求的整个通信链路,直接用了我工作上一个接口,但我把敏感信息都换了,所以是请求不通的哈

    curl  --trace-ascii - --location --request POST 'http://test.com/account.login?ver=1.0&df=json&cver=3.7.8&os=android' 
    --header 'Content-Type: application/json' 
    --data-raw '{
        "id":"123",
        "service":"account.login",
        "client":{
            "ve":"3.7.8",
            "os":"android",
            "fr":"API Level-27",
            "gameId":"100000",
            "channelId":"100000",
            "si":"123",
            "ex":{
                "brand":"vivo",
                "dpfr":"8.1.0",
                "imei":"123",
                "imsi":"123",
                "mac":"123",
                "mf":"vivo",
                "mobile":"",
                "model":"123",
                "net":"wifi",
                "orient":"P",
                "packageName":"123",
                "resX":"1080",
                "resY":"2034",
                "subChannelId":"",
                "utdid":"123",
                "versionCode":"1",
                "versionName":"3.7.8"
            },
            "empty":false
        },
        "data":{
            "ex":{
                "token":"123"
            }
        }
    }'

    请求部分

    响应部分

    可以说非常详细了,连每个字段的字节大小都返回了

    -w

    • 等价参数: --write-out <format>
    • 作用:完成请求后指定输出格式
    • 单独的文章讲解,比较多变量

    https://www.cnblogs.com/poloyy/p/14877100.html 

    -X(常用)

    • 等价参数: --request <command>
    • 作用:指定 HTTP 请求的 Method
    curl -v -X POST http://baidu.com
    curl -v --request POST http://baidu.com

    工作中常用模板

    不一定完全万能可用,根据自己需要进行修改

    GET 请求

    curl -L -S -s -K http://baidu.com

    POST 请求

    curl -L -S -s -K -X post 
    -H "Content-type:application/json" 
    -H ".." 
    --data-raw "
    {
         "a":123,
         "b:123        
    }"
  • 相关阅读:
    使用sublimehighlight 将文本 转化html
    iOS- 制作U盘安装Mac OS X 系统
    垃圾回收的常见算法
    jvm的三种参数类型
    HashMap遍历取值
    不要在 foreach 循环里进行元素的 remove/add 操作
    Arrays.asList()使用指南
    正确使用 equals 方法
    elasticsearch安装与配置(在Linux环境下配置)
    本地访问Linux里端口连接失败
  • 原文地址:https://www.cnblogs.com/poloyy/p/14854183.html
Copyright © 2020-2023  润新知