一. 使用HTTPie测试WEB服务
在上一小节,我们使用了Postman测试WEB api,如果钟爱于使用命令行测试,那么也可以使用HTTPie。
1.假设服务运行在127.0.0.1:5000上,在另一个窗口可以使用如下方式发起get请求:
http --json --auth 用户名:密码 GET http://127.0.0.1:5000/api/v1/posts/
将分页返回博客文章:
2.下面这个命令使用POST请求添加一篇新文章:
http --auth 用户名:密码 --json POST http://127.0.0.1:5000/api/v1/posts/ "body=post from command line."
响应:
3.如果不想使用用户名和密码验证身份,可以先向/api/v1/tokens/发送post请求获取令牌:
http --auth 用户名:密码 --json POST http://127.0.0.1:5000/api/v1/token
响应:
之后就可以使用如下形式发送新请求:
二. 补充:HTTPie介绍
HTTPie和同类的curl相比,它的命令更简洁直观,易于记忆和使用。它内置了JSON支持,而且对输出的内容进行了排版和高亮显示。HTTPie使用pipenv或pip安装:
pipenv install httpie --dev
在HTTPie中,请求从HTTP开始,一个完整的请求语句大概会是这样:
http --json GET api.example.com name==greyli data=test Header-Foo:bar
从上面的语句可以发现,HTTPie对不同的内容使用不同的符号,先总结如下表:
类别 | 符号 | 示例 |
URL参数 | == | param==value |
首部字段(Head) | : | Name:Value |
数据字段 | = | field=value |
原生JSON字段 | := | field:=value |
表单上传字段 | @ | field@/dir/file |
此外,为了简化输入,HTTP还提供了一系列缺省选项,这些选项的默认值如下:
简写形式 | 缺省值 | 默认值 |
example.com | HTTP协议 | http |
:5000 | 本地主机地址 | localhost |
: | 本地主机地址,端口 | localhost:80 |
留空 | 请求方法 | GET |
利用HTTPie默认值,获取某篇文章的所有评论,命令可以简写为:
>http --json :5000/api/v1/posts/1/comments/ Authorization:"Basic ZXlKaGJHY2lPaUpJVXpVeE1pSXNJbWxoZENJNk1UVTRNems1TVRjMU1Td2laWGh3SWpveE5UZ3pPVGsxTXpVeGZRLmV5SnBaQ0k2T0gwLmtfNk9uVmp5NFcxYmlHaGnckdjljmflmphaURNRUdScnJaUHExMjdDMnd4REtsNS1ER19yMWY0OS02WDhLZHNKVHUyU1NvLWxFcjlBTWNnd0x6NVJ3Og=="
注意:此处并没有使用--auth选项,而是使用更通用的一种写法,使用key:value的形式直接将认证凭据手动放到了请求头。Basic Auth中,将认证信息以"name:password"的形式进行Base64编码,放在Head的Authorization字段中。Base64不涉及加密,因此是明文的形式,只能借助https加密保证安全。我这了的Authorization值是使用postman生成的复制下来的,如下:
响应结果:
默认获取第一页,使用查询参数page==2可以获取第二页:
http --json :5000/api/v1/posts/1/comments/ page==2 Authorization:"Basic ZXlKaGJHY2lPaUpJVXpVeE1pSXNJbWxoZENJNk1UVTRNems1TVRjMU1Td2laWGh3SWpveE5UZ3pPVGsxTXpVeGZRLmV5SnBaQ0k2T0gwLmtfNk9uVmp5NFcxYmlHaGoxVVVNN21QSmphaURNRUdScnJaUHExMjdDMnd4REtsNS1ER19yMWY0OS02WDhLZHNKVHUyU1NvLWxFcjlBTWNnd0x6NVJ3Og=="
运行结果:
后端分页时,我们使用paginate方法,并将error_out参数设为False,当page超出pagination.pages时,并不会报错:
http --json :5000/api/v1/posts/1/comments/ page==3 Authorization:"Basic ZXlKaGJHY2lPaUpJVXpVeE1pSXNJbWxoZENJNk1UVTRNems1TVRjMU1Td2laWGh3SWpveE5UZ3pPVGsxTXpVeGZRLmV5SnBaQ0k2T0gwLmtfNk9uVmp5NFcxYmlHaGoxVVVNN21QSmphaURNRUdScnJaUHExMjdDMnd4REtsNS1ER19yMWY0OS02WDhLZHNKVHUyU1NvLWxFcjlBTWNnd0x6NVJ3Og=="
响应结果:
当需要发送POST请求提交表单时,因为表单数据需要以www-x-formencode的形式写入请求主体,需要使用--form选项。表单数据以key=value的形式传入,表单字段以空格分隔。
为了避免每次请求都输入Authorization字段,可以使用--session=Authorization字段临时存储在本地,比如:
http --json --session=Authorization :5000/api/v1/users/1 Authorization:"Basic ZXlKaGJHY2lPaUpJVXpVeE1pSXNJbWxoZENJNk1UVTRNems1Tmpjd05Td2laWGh3SWpveE5UZzBNREF3TXpBMWZRLmV5SnBaQ0k2T0gwLjlEMUxBVGc1c3hZUHJ2VlZnYmZ2OWJxdEdxMnJPLUFkd2VmZklmVUpVMHVxR29TT2w5MXpZQmpUMThocHZBMGpXTlJmOGU3RmFIcU9rVF9PZW9WSzB3Og=="
响应结果: