• HTTPIE 工具使用入门


    背景
    python有一个requests库,httpie就是基于requests开发的,接口调试测试的命令行工具,跟curl 命令行工具类似,但比curl更加简洁。

    1.httpie VS curl

    curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{  
       "send_type": "wechat",  
       "to": [  
         "xn080xxx",  
       ],  
       "content": "this is xxx alert"  
     }' 'http://aaa.xxx.com/api/v1/alert'

    httpie

    http aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert"

    可以看到,http版本比curl简单了很多,主要原因如下:

    将常见场景、大概率行为变成了默认值
    只需人类输入最核心的业务信息,多余的语法格式由程序自己分析判断
    具体为:
    1. get和post是大概率行为,人类执行get时,一般不带request data,带request data的基本都是post行为。因此,httpie将这两个常见大概率行为变成默认值。—— 如果http命令不带request data,默认行为是get;如果带了request data,默认行为是post
    2. 采用json交互基本是当今人类的最常见的场景,因此,header的两个地方默认设置为application/json,可以在大概率场景中节省人工输入
    3. json交互作为大概率事件,简化json数据输入可以节省很多人工。curl采用json的raw的格式输入,不是很高效。httpie用=代表request data,:代表header data,==代表query data,自动识别,无需呆板的完整定义各个数据体,将多余的人工操作尽可能自动化
    4. 字符串输入是大概率行为,因此字符串的赋值,无需双引号,除非里面有空格等特殊字符。将其他较小概率的数据类型采用:=进行输入(raw格式,如整形数,数组)
    5. 不加http://也是可以的,这是默认行为

    从以上分析可以看出,httpie将大概率的人工操作进行了简化设计,因此,人工操作可以节省很多时间。

    2.安装httpie,使用是http,别搞错了

    pip install httpie

    3. httpie 命令

    # 显示请求信息(包含返回头200)
    http mimvp.com
    
    # 显示详细的请求(包含请求和返回头200)
    http -v mimvp.com
    
    # 只显示Header
    http -h mimvp.com
    http --head mimvp.com
    http --header mimvp.com
    http --headers mimvp.com
    
    # 只显示Body
    http -b mimvp.com
    http --body mimvp.com
    
    # 下载文件
    http -d mimvp.com
    
    # 模拟提交表单
    http -f POST mimvp.com username='mimvp-user'
    
    # 请求删除的方法
    http DELETE mimvp.com
    
    # 传递JSON数据请求(默认就是JSON数据请求)
    http PUT mimvp.com username='mimvp-user' password='mimvp-pwd'
    
    # 如果JSON数据存在不是字符串则用:=分隔,例如
    http PUT mimvp.com username='mimvp-user' password='mimvp-pwd' age:=28 a:=true streets:='["a", "b"]'
    
    # 模拟Form的Post请求, Content-Type: application/x-www-form-urlencoded; charset=utf-8
    http --form POST mimvp.com username='mimvp-user'
    
    # 模拟Form的上传, Content-Type: multipart/form-data
    http -f POST example.com/jobs username='mimvp-user' file@~/test.pdf
    
    # 修改请求头, 使用:分隔
    http mimvp.com  User-Agent:mimvp-agent/1.0  'Cookie:a=b;b=c'  Referer:http://mimvp.com/
    
    # 认证
    http -a username:password mimvp.com
    http --auth-type=digest -a username:password mimvp.com
    
    # 使用http代理
    http --proxy=http:http://217.107.197.174:8081 proxy.mimvp.com
    http --proxy=http:http://user:pass@217.107.197.174:8081 proxy.mimvp.com
    http --proxy=https:http://112.114.96.34:8118 proxy.mimvp.com
    http --proxy=https:http://user:pass@112.114.96.34:8118 proxy.mimvp.com

    往一个https网站post一个json数据,而且需要认证。

    http https://aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert -a username:password"

    简化https
    在你的~/.bashrc等类似文件加入:

    alias https='http --default-scheme=https'


    这样,可以简化为:

    https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert -a username:password"

    这样的alias非常方便,http和https非常形象直观

    简化认证并隐藏密码信息
    session方法
    第一次执行

    https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert" -a username:password --session=your-session-name


    这样,就会产生一个session文件,里面包含了header,认证,cookie等信息(默认在~/.httpie/sessions/your_url/your_sesssion_name里)

    以后执行,直接使用该session文件即可,无需再加-a username:password

    https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert" --session=your-session-name

    .netrc方法(更简单)
    在~/.netrc中加入

    machine url_you_want_to_visit
    login your_username
    password your_password

    这样,程序会自动带上这个认证,语句简化为:

    https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert"

    ~/.netrc是一种通用方法,支持该文件的其他网络操作都可以采用这种方法。

    简化json数据
    我们会发现,在开发测试中,经常需要重复类似指令,能否把json数据也简化输入呢

    简化麻烦输入的非字符串部分
    上面的语句最麻烦,且经常记错的就是 to:=’[“xn080xxx”]’,单引号,双引号不能搞错,最外面是单引号,里面的元素是双引号,我用了N多次,一段时间没用就又容易忘记。
    简化它
    httpie支持文件输入
    新增一个例如to.json文件,里面内容

    ["xn080xxx"]

    这样,上面语句简化为:

    https aaa.xxx.com/api/v1/alert send_type=tts to:=@to.json content="this is alert"

    @后面跟的就是文件

    全部数据来自文件(最简单)
    采用重定向即可
    新增文件,例如send.json

    {
    "send_type": "tts",
    "to": ["xn080xxx"],
    "content": "this is alert"
    }

    上面语句简化为:

    https aaa.xxx.com/api/v1/alert < send.json"

    是的,这已经极其精简了!

    httpie在脚本中应用的注意事项
    httpie在脚本中使用,需要注意几点(易错点):

    http默认不理会返回的状态码,如果需要区分2xx,4xx等,需要加入 –check-status

    https --check-status aaa.xxx.com/api/v1/alert < send.json"

    这样,当2XX返回时, echo $?得到是0;当4xx返回时,echo $? 得到的是4

    in输入管道的问题
    这个坑被坑过,脚本中,in输入管道被重定向,会被输入一些数据,产生不可预料的行为。
    应该–ignore-stdin
    例如:

    https --check-status --ignore-stdin aaa.xxx.com/api/v1/alert < send.json"

    课外:有趣的http-prompt
    pip install http-prompt 后
    你可以体验用全新的理念来操作httpie的方法
    http-prompt

    解疑
    当使用环境变量时,无法正常使用,如:

    export phone=1862030xxxx
    https aaa.xxx.com/api/v1/alert send_type=tts to:='["${phone}"]' content="this is alert"

    解答
    本质是单引号内的变量不会被正常解析,后端收到的to的value实际是${phone}。
    单引号内如果需要解析变量,多加一层单引号即可,如下:

    https aaa.xxx.com/api/v1/alert send_type=tts to:='["'${phone}'"]' content="this is alert"

    实际上,如果shell有语法高亮,也会发现单引号里面其实是不会翻译变量的。
    (提高:对于很多语言,也是遵循这个规则,单引号内的变量不翻译,双引号内才翻译变量,例如groovy语言等)

  • 相关阅读:
    前端开发网址
    Iconfot阿里妈妈-css高级应用
    手机端的META你知道多少?
    24个 HTML5 & CSS3 下拉菜单效果及制作教程
    css :clip rect 正确的使用方法
    layui :iframe 与 layer 的位置问题
    时间戳转现实时间的方法
    关于 iframe 的小问题若干
    使用 forever 启动 vue 需要注意的问题
    var 的一个坑,以及 let
  • 原文地址:https://www.cnblogs.com/guo2733/p/12332328.html
Copyright © 2020-2023  润新知