背景

本文作者长期从事微服务开发,在实践中,httpie给我提效不少。
如果你还在使用curl,那么这篇文章就是给你的。
python有一个给人类使用的requests库,非常的简单方便。httpie就是基于requests开发的,给人类用的命令行工具,取代curl的绝佳工具。

什么叫“给人类用的”

经过长期的理解,我的总结如下:
给人类用的,需要满足如下:

  • 将常见场景、大概率行为变成了默认值
  • 只需人类输入最核心的业务信息,多余的语法格式由程序自己分析判断

给机器用的,就是所有的行为,不管是常见还是不常见的,都需要具体命令告知它。

最开始的技术,都是给机器用的。在长期的实践中,人类出现了很多常见行为或场景,将这些行为、场景变成默认值等方式,可以在大概率场景中,节省人类的工作量。

参考资料

有时间建议读完官方文档

httpie应用精华

httpie VS curl

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'
http
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将大概率的人工操作进行了简化设计,因此,人工操作可以节省很多时间。

安装

这么好的东西赶紧安装

pip install httpie

使用时,是用http ,不是httpie

再简单一些

见下面这个常见指令,往一个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

解疑

  1. 当使用环境变量时,无法正常使用,如:
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语言等)

你应该立刻放下curl,拿起httpie来高效干活相关推荐

  1. linux http 测试页面,使用 HTTPie 进行 API 测试 | Linux 中国

    原标题:使用 HTTPie 进行 API 测试 | Linux 中国 使用 HTTPie 调试 API,这是一个用 Python 写的易用的命令行工具. -- Moshe Zadka 是一个非常易用. ...

  2. 使用curl工具调试https接口

    工作中需要对接调试http接口,之前都是写代码测试,发现直接用curl这个工具更简单高效. 举例如下: 想要post一包数据给这个接口https://XXXXXXXXX http报文头规定如下: PO ...

  3. 中国式姥姥上热搜感动无数人:有妈妈在,我才敢生娃

    你做我的朗读者   我做你的摆渡人 戳蓝字一键关注 视学算法 ☾ 无论你在哪里,请记得打开手机. ♪ 点上方绿标即可收听主播安然朗读音频 来源:新东方家庭教育(ID:xdfjtjy) 在姥姥的疼爱里长 ...

  4. IT职场最受欢迎的十大晋升秘决

    第一招:兵来将挡,水来土掩 永远要有这样的心理准备:如果上司突然交给你一个任务,并要你在短时间内完成,你必须有兵来将挡.水来土掩的能耐与决心,千万不可表现出不知所措的恐慌状.一般公司老板在提拔人才时, ...

  5. 构建之法阅读笔记之速读篇

    新学期开始,我们开设了软件工程课程,在老师的指导下,我从网上找到了<构建之法>这本书,随着课堂上老师的讲解以及书籍的快速阅读,我对软件工程有了很多的了解.之前我们的编程只能算是基础,远远没 ...

  6. 小菜学设计模式——观察者模式

    2019独角兽企业重金招聘Python工程师标准>>> 背景 上一次去看电影院看电影,半旁边的妹子说只要扫一扫就能免费领取爆米花一份,你说我怎么躲得过妹子的招数呢?所以拿起我的手机, ...

  7. 为什么软件工程师找不到工作?我想分享四个“恐怖故事”

    编者按:作为一个程序员,如果没有收到心仪的工作offer,你是不是会对自己失去信心?对接创业者和程序员的网站coderfit.com 的创始人Iwan认为你无须担心.他分享了四个"恐怖故事& ...

  8. gduuu 中旅 他最恨的是猎人

    今天的砰砰砰枪响了的中旅,但其实真正使威尼派克狼恋恋不舍的是爱是对吉姆的爱,但他最恨的是猎人,一条条细绳,红色的圆底像个大苹果,在镇上生活就是舍不得吉姆,跳的姿色真美,那就是一位圣诞老人呀渐渐地,狗差 ...

  9. Git版本控制使用方法入门教程?

    考虑到CVS的一些局限性,最近和同事在公司推行Git.     其实,如果推行SVN的化,可能推行的难度会降低很多.不过lark说既然推行一个新的版本管理工具,总要花费一定的时间进行培训.部署.转换. ...

最新文章

  1. 寻找凸包 (Convex Hull)
  2. Linux xshell窗口批量命令编辑功能(发送键输入到所有窗口)
  3. Spring AOP capabilities and goals
  4. GitLab 自动触发 Jenkins 构建
  5. DataGridRow的创建
  6. (进阶篇_01)Oracle数据同步3种场景
  7. windows中的定时任务--任务计划程序
  8. phpstudy的php fpm,PHP_php-fpm配置详解,php5.3自带php-fpm复制代码 代码 - phpStudy
  9. 程序猿跳槽季,为什么你的薪水总升不上去?
  10. StringBuilder对象扩展
  11. Ubuntu18突然卡死解决方法
  12. chemdraw怎么画拐弯的箭头_教你画系列,像金属一样有复杂反光的漆皮材质
  13. chat后缀域名_.chat域名简介
  14. Mac和Windows哪个好 ?windows和mac对比介绍
  15. 有学历的程序员永远不懂没学历的痛,就像白天不懂夜的黑
  16. odoo11 odoo.addons.base.ir.ir_model: Access Denied by ACLs for operation: read, uid: 4,
  17. 右键添加显示隐藏文件夹功能
  18. 【C语言之入门规划】料峭春风吹酒醒,C语言学习规划与展望。
  19. 商越程序:企业在采购数字化变革设计思路上的“四个改变”
  20. LabVIEW控制Arduino采集电位器电压(基础篇—4)

热门文章

  1. bert生成句子向量
  2. 激光slam 理论详解(一)
  3. github+hexo搭建个人博客(1.简单搭建)
  4. linux系统LVM磁盘扩容
  5. asp.net membership
  6. vue解决线上跨域的问题_Vue项目中跨域问题解决方案
  7. CRM客户管理软件系统有哪些功能模块
  8. android WIFI to unity
  9. 多元随机变量及其分布
  10. 基本的TCP套接字编程(详解)