比Postman更方便的接口调试工具HTTPie

来呀~

欢迎关注我的公众号「测试游记」

官方网站:https://httpie.org/

常用的http请求工具的缺点

  • postman

不够灵活

需要打开客户端「打开慢」

学习成本高「测试,断言等」

  • Jmeter

臃肿

麻烦

学习成本高「变量,cookie的管理等」

  • curl

参数多

不够灵活

主要在Linux平台中使用

学习成本高

  • wget

Linux中下载资源的工具

参数多

主要功能是命令行下载,功能单一

HTTP客户端命令行工具-HTTPie

  • 基于命令行

  • 支持JSON

  • 支持语法高亮,格式化输出

  • 支持wget下载

  • 支持session会话

  • 支持HTTPS

  • 支持代理,认证

  • 支持表单提交,文件提交

  • 支持请求头,请求体,响应头或相遇体

  • 支持多平台

安装

windows:

$ pip install --upgrade pip setuptools	
$ pip install --upgrade httpie

其他:https://httpie.org/doc#installation

查看帮助

官方文档:https://httpie.org/doc

$ http --help	
zhongxindeMacBook-Pro:~ zhongxin$ http --help	
usage: http [--json] [--form] [--pretty {all,colors,format,none}]	
            [--style STYLE] [--print WHAT] [--headers] [--body] [--verbose]	
            [--all] [--history-print WHAT] [--stream] [--output FILE]	
            [--download] [--continue]	
            [--session SESSION_NAME_OR_PATH | --session-read-only SESSION_NAME_OR_PATH]	
            [--auth USER[:PASS]] [--auth-type {basic,digest}]	
            [--proxy PROTOCOL:PROXY_URL] [--follow]	
            [--max-redirects MAX_REDIRECTS] [--timeout SECONDS]	
            [--check-status] [--verify VERIFY]	
            [--ssl {ssl2.3,tls1,tls1.1,tls1.2}] [--cert CERT]	
            [--cert-key CERT_KEY] [--ignore-stdin] [--help] [--version]	
            [--traceback] [--default-scheme DEFAULT_SCHEME] [--debug]	
            [METHOD] URL [REQUEST_ITEM [REQUEST_ITEM ...]]	
HTTPie - a CLI, cURL-like tool for humans. <http://httpie.org>	
Positional Arguments:	
  These arguments come after any flags and in the order they are listed here.	
  Only URL is required.	
  METHOD	
      The HTTP method to be used for the request (GET, POST, PUT, DELETE, ...).	
      This argument can be omitted in which case HTTPie will use POST if there	
      is some data to be sent, otherwise GET:	
          $ http example.org               # => GET	
          $ http example.org hello=world   # => POST	
  URL	
      The scheme defaults to 'http://' if the URL does not include one.	
      (You can override this with: --default-scheme=https)	
      You can also use a shorthand for localhost	
          $ http :3000                    # => http://localhost:3000	
          $ http :/foo                    # => http://localhost/foo	
  REQUEST_ITEM	
      Optional key-value pairs to be included in the request. The separator used	
      determines the type:	
      ':' HTTP headers:	
          Referer:http://httpie.org  Cookie:foo=bar  User-Agent:bacon/1.0	
      '==' URL parameters to be appended to the request URI:	
          search==httpie	
      '=' Data fields to be serialized into a JSON object (with --json, -j)	
          or form data (with --form, -f):	
          name=HTTPie  language=Python  description='CLI HTTP client'	
      ':=' Non-string JSON data fields (only with --json, -j):	
          awesome:=true  amount:=42  colors:='["red", "green", "blue"]'	
      '@' Form file fields (only with --form, -f):	
          cs@~/Documents/CV.pdf	
      '=@' A data field like '=', but takes a file path and embeds its content:	
           essay=@Documents/essay.txt	
      ':=@' A raw JSON field like ':=', but takes a file path and embeds its content:	
          package:=@./package.json	
      You can use a backslash to escape a colliding separator in the field name:	
          field-name-with\:colon=value	
Predefined Content Types:	
  --json, -j	
      (default) Data items from the command line are serialized as a JSON object.	
      The Content-Type and Accept headers are set to application/json	
      (if not specified).	
  --form, -f	
      Data items from the command line are serialized as form fields.	
      The Content-Type is set to application/x-www-form-urlencoded (if not	
      specified). The presence of any file fields results in a	
      multipart/form-data request.	
Output Processing:	
  --pretty {all,colors,format,none}	
      Controls output processing. The value can be "none" to not prettify	
      the output (default for redirected output), "all" to apply both colors	
      and formatting (default for terminal output), "colors", or "format".	
  --style STYLE, -s STYLE	
      Output coloring style (default is "auto"). One of:	
          abap, algol, algol_nu, arduino, auto, autumn, borland, bw,	
          colorful, default, emacs, friendly, fruity, igor, lovelace,	
          manni, monokai, murphy, native, paraiso-dark, paraiso-light,	
          pastie, perldoc, rainbow_dash, rrt, sas, solarized,	
          solarized-dark, solarized-light, stata, stata-dark, stata-	
          light, tango, trac, vim, vs, xcode	
      The "auto" style follows your terminal's ANSI color styles.	
      For non-auto styles to work properly, please make sure that the	
      $TERM environment variable is set to "xterm-256color" or similar	
      (e.g., via `export TERM=xterm-256color' in your ~/.bashrc).	
Output Options:	
  --print WHAT, -p WHAT	
      String specifying what the output should contain:	
          'H' request headers	
          'B' request body	
          'h' response headers	
          'b' response body	
      The default behaviour is 'hb' (i.e., the response headers and body	
      is printed), if standard output is not redirected. If the output is piped	
      to another program or to a file, then only the response body is printed	
      by default.	
  --headers, -h	
      Print only the response headers. Shortcut for --print=h.	
  --body, -b	
      Print only the response body. Shortcut for --print=b.	
  --verbose, -v	
      Verbose output. Print the whole request as well as the response. Also print	
      any intermediary requests/responses (such as redirects).	
      It's a shortcut for: --all --print=BHhb	
  --all	
      By default, only the final request/response is shown. Use this flag to show	
      any intermediary requests/responses as well. Intermediary requests include	
      followed redirects (with --follow), the first unauthorized request when	
      Digest auth is used (--auth=digest), etc.	
  --history-print WHAT, -P WHAT	
      The same as --print, -p but applies only to intermediary requests/responses	
      (such as redirects) when their inclusion is enabled with --all. If this	
      options is not specified, then they are formatted the same way as the final	
      response.	
  --stream, -S	
      Always stream the output by line, i.e., behave like `tail -f'.	
      Without --stream and with --pretty (either set or implied),	
      HTTPie fetches the whole response before it outputs the processed data.	
      Set this option when you want to continuously display a prettified	
      long-lived response, such as one from the Twitter streaming API.	
      It is useful also without --pretty: It ensures that the output is flushed	
      more often and in smaller chunks.	
  --output FILE, -o FILE	
      Save output to FILE instead of stdout. If --download is also set, then only	
      the response body is saved to FILE. Other parts of the HTTP exchange are	
      printed to stderr.	
  --download, -d	
      Do not print the response body to stdout. Rather, download it and store it	
      in a file. The filename is guessed unless specified with --output	
      [filename]. This action is similar to the default behaviour of wget.	
  --continue, -c	
      Resume an interrupted download. Note that the --output option needs to be	
      specified as well.	
Sessions:	
  --session SESSION_NAME_OR_PATH	
      Create, or reuse and update a session. Within a session, custom headers,	
      auth credential, as well as any cookies sent by the server persist between	
      requests.	
      Session files are stored in:	
          /Users/zhongxin/.httpie/sessions/<HOST>/<SESSION_NAME>.json.	
  --session-read-only SESSION_NAME_OR_PATH	
      Create or read a session without updating it form the request/response	
      exchange.	
Authentication:	
  --auth USER[:PASS], -a USER[:PASS]	
      If only the username is provided (-a username), HTTPie will prompt	
      for the password.	
  --auth-type {basic,digest}, -A {basic,digest}	
      The authentication mechanism to be used. Defaults to "basic".	
      "basic": Basic HTTP auth	
      "digest": Digest HTTP auth	
Network:	
  --proxy PROTOCOL:PROXY_URL	
      String mapping protocol to the URL of the proxy	
      (e.g. http:http://foo.bar:3128). You can specify multiple proxies with	
      different protocols.	
  --follow, -F	
      Follow 30x Location redirects.	
  --max-redirects MAX_REDIRECTS	
      By default, requests have a limit of 30 redirects (works with --follow).	
  --timeout SECONDS	
      The connection timeout of the request in seconds. The default value is	
      30 seconds.	
  --check-status	
      By default, HTTPie exits with 0 when no network or other fatal errors	
      occur. This flag instructs HTTPie to also check the HTTP status code and	
      exit with an error if the status indicates one.	
      When the server replies with a 4xx (Client Error) or 5xx (Server Error)	
      status code, HTTPie exits with 4 or 5 respectively. If the response is a	
      3xx (Redirect) and --follow hasn't been set, then the exit status is 3.	
      Also an error message is written to stderr if stdout is redirected.	
SSL:	
  --verify VERIFY	
      Set to "no" (or "false") to skip checking the host's SSL certificate.	
      Defaults to "yes" ("true"). You can also pass the path to a CA_BUNDLE file	
      for private certs. (Or you can set the REQUESTS_CA_BUNDLE environment	
      variable instead.)	
  --ssl {ssl2.3,tls1,tls1.1,tls1.2}	
      The desired protocol version to use. This will default to	
      SSL v2.3 which will negotiate the highest protocol that both	
      the server and your installation of OpenSSL support. Available protocols	
      may vary depending on OpenSSL installation (only the supported ones	
      are shown here).	
  --cert CERT	
      You can specify a local cert to use as client side SSL certificate.	
      This file may either contain both private key and certificate or you may	
      specify --cert-key separately.	
  --cert-key CERT_KEY	
      The private key to use with SSL. Only needed if --cert is given and the	
      certificate file does not contain the private key.	
Troubleshooting:	
  --ignore-stdin, -I	
      Do not attempt to read stdin.	
  --help	
      Show this help message and exit.	
  --version	
      Show version and exit.	
  --traceback	
      Prints the exception traceback should one occur.	
  --default-scheme DEFAULT_SCHEME	
      The default scheme to use if not specified in the URL.	
  --debug	
      Prints the exception traceback should one occur, as well as other	
      information useful for debugging HTTPie itself and for reporting bugs.	
For every --OPTION there is also a --no-OPTION that reverts OPTION	
to its default value.	
Suggestions and bug reports are greatly appreciated:	
    https://github.com/jakubroztocil/httpie/issues

创建一个简单的Flask项目进行测试

from flask import Flask	
app = Flask(__name__)	
@app.route('/')	
def hello_world():	
    return 'Hello World!'	
if __name__ == '__main__':	
    app.run()

语法格式

http [flags] [METHOD] URL [ITEM [ITEM]]

get请求

$ http url	
zhongxindeMacBook-Pro:~ zhongxin$ http http://127.0.0.1:5000/	
HTTP/1.0 200 OK	
Content-Length: 12	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:16:27 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
Hello World!

640?wx_fmt=jpeg

post请求

把测试代码改一改

from flask import Flask, request	
app = Flask(__name__)	
@app.route('/', methods=['POST', 'GET'])	
def hello_world():	
    if request.method == 'GET':	
        return 'Hello World!'	
    elif request.method == 'POST':	
        data = request.get_data()	
        return data	
if __name__ == '__main__':	
    app.run()
$ http url key=value key=value	
$ http POST url key=value key=value	
zhongxindeMacBook-Pro:~ zhongxin$ http http://127.0.0.1:5000/ name='zx' age=25	
HTTP/1.0 200 OK	
Content-Length: 27	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:21:13 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
{	
    "age": "25",	
    "name": "zx"	
}

640?wx_fmt=jpeg

delete请求

再修改一下测试代码

@app.route('/', methods=['POST', 'GET','DELETE'])	
def hello_world():	
    if request.method == 'GET':	
        return 'Hello World!'	
    elif request.method == 'POST':	
        data = request.get_data()	
        return data	
    elif request.method =='DELETE':	
        return '删啥呢'
$ http DELETE http://127.0.0.1:5000/	
zhongxindeMacBook-Pro:~ zhongxin$ http DELETE http://127.0.0.1:5000/	
HTTP/1.0 200 OK	
Content-Length: 9	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:24:14 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
删啥呢

640?wx_fmt=jpeg

其他请求也类似

form表单

先安装一下 flask-wtf

$ pip install flask-wtf
from flask import Flask, request	
from flask_wtf import FlaskForm	
from wtforms import StringField, TextAreaField	
app = Flask(__name__)	
class MyForm(FlaskForm):	
    name = StringField('Name')	
    age = TextAreaField('Age')	
@app.route('/', methods=['POST', 'GET', 'DELETE'])	
def hello_world():	
    if request.method == 'GET':	
        return 'Hello World!'	
    elif request.method == 'POST':	
        form = MyForm(csrf_enabled=False)	
        name = form.name.data	
        age = form.age.data	
        return f'从form表单拿到的name:{name},age:{age}'	
    elif request.method == 'DELETE':	
        return '删啥呢'	
if __name__ == '__main__':	
    app.run()
$ http -f http://127.0.0.1:5000/ name=zx age=25	
HTTP/1.0 200 OK	
Content-Length: 36	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:35:00 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
从form表单拿到的name:zx,age:25

640?wx_fmt=jpeg

使用 -v查看请求的全部信息

zhongxindeMacBook-Pro:~ zhongxin$ http -f -v http://127.0.0.1:5000/ name=zx age=25	
POST / HTTP/1.1	
Accept: */*	
Accept-Encoding: gzip, deflate	
Connection: keep-alive	
Content-Length: 14	
Content-Type: application/x-www-form-urlencoded; charset=utf-8	
Host: 127.0.0.1:5000	
User-Agent: HTTPie/1.0.3	
name=zx&age=25	
HTTP/1.0 200 OK	
Content-Length: 36	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:36:31 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
从form表单拿到的name:zx,age:25

640?wx_fmt=jpeg

查询字符串产生

url?xx=xx&xx=xx

使用两个 =name==zx age==25

$ http  -v http://127.0.0.1:5000/ name==zx age==25	
zhongxindeMacBook-Pro:~ zhongxin$ http  -v http://127.0.0.1:5000/ name==zx age==25	
GET /?name=zx&age=25 HTTP/1.1	
Accept: */*	
Accept-Encoding: gzip, deflate	
Connection: keep-alive	
Host: 127.0.0.1:5000	
User-Agent: HTTPie/1.0.3	
HTTP/1.0 200 OK	
Content-Length: 12	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:39:24 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
Hello World!

640?wx_fmt=jpeg

修改请求头

$ http -v http://127.0.0.1:5000/ User-Agent:666	
GET / HTTP/1.1	
Accept: */*	
Accept-Encoding: gzip, deflate	
Connection: keep-alive	
Host: 127.0.0.1:5000	
User-Agent: 666	
HTTP/1.0 200 OK	
Content-Length: 12	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:40:42 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
Hello World!

640?wx_fmt=jpeg

传递JSON

http -v http://127.0.0.1:5000/ z:=[1,2,3]	
zhongxindeMacBook-Pro:~ zhongxin$ http -v http://127.0.0.1:5000/ z:=[1,2,3]	
POST / HTTP/1.1	
Accept: application/json, */*	
Accept-Encoding: gzip, deflate	
Connection: keep-alive	
Content-Length: 16	
Content-Type: application/json	
Host: 127.0.0.1:5000	
User-Agent: HTTPie/1.0.3	
{	
    "z": [	
        1,	
        2,	
        3	
    ]	
}	
HTTP/1.0 200 OK	
Content-Length: 32	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 15:46:40 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
从form表单拿到的name:,age:

640?wx_fmt=jpeg

上传文件

class MyForm(FlaskForm):	
    name = StringField('Name')	
    age = TextAreaField('Age')	
    photo = FileField('Photo')
$ http -v -f http://127.0.0.1:5000/ age=25 name=zx photo@/Users/zhongxin/Desktop/httpie_test/小哀.png	
zhongxindeMacBook-Pro:~ zhongxin$ http -v -f http://127.0.0.1:5000/ age=25 name=zx photo@/Users/zhongxin/Desktop/httpie_test/小哀.png	
POST / HTTP/1.1	
Accept: */*	
Accept-Encoding: gzip, deflate	
Connection: keep-alive	
Content-Length: 1307355	
Content-Type: multipart/form-data; boundary=e9ff6d5440b8069e68bf49813d0a5ddd	
Host: 127.0.0.1:5000	
User-Agent: HTTPie/1.0.3	
+-----------------------------------------+	
| NOTE: binary data not shown in terminal |	
+-----------------------------------------+	
HTTP/1.0 200 OK	
Content-Length: 36	
Content-Type: text/html; charset=utf-8	
Date: Thu, 10 Oct 2019 16:09:15 GMT	
Server: Werkzeug/0.15.5 Python/3.7.1	
从form表单拿到的name:zx,age:25

640?wx_fmt=jpeg

640?wx_fmt=jpeg

小结

  • name:value 修改请求头

  • name==valueurl查询字符串参数

  • name=valueJSON或者加 -f变为form表单提交

  • name:=value传递JSON的布尔,数值,嵌套,Array类型「类似python列表」

  • name@/dir/file以form表单来上传文件

获取请求和响应信息

  • 获取响应头: -h

  • 获取响应体: -b

  • 获取请求头: -p H 或 --print=H

  • 获取请求体: -p B 或 --print=B

认证

Flask例子懒得打了,就这样看看好了

Basic auth
$ http -a username:password example.org
Digest auth
$ http -A digest -a username:password example.org

Sessions

# 创建新会话	
$ http --session=/tmp/session.json example.org API-Token:123	
# 使用旧的会话信息	
$ http --session=/tmp/session.json example.org
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值