比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. 	
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//.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!

比Postman更方便的接口调试工具HTTPie_第1张图片

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"	
}

比Postman更方便的接口调试工具HTTPie_第2张图片

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	
删啥呢

比Postman更方便的接口调试工具HTTPie_第3张图片

其他请求也类似

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

比Postman更方便的接口调试工具HTTPie_第4张图片

使用 -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

比Postman更方便的接口调试工具HTTPie_第5张图片

查询字符串产生

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!

比Postman更方便的接口调试工具HTTPie_第6张图片

修改请求头

$ 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!

比Postman更方便的接口调试工具HTTPie_第7张图片

传递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:

比Postman更方便的接口调试工具HTTPie_第8张图片

上传文件

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

比Postman更方便的接口调试工具HTTPie_第9张图片

比Postman更方便的接口调试工具HTTPie_第10张图片

小结

  • 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

你可能感兴趣的:(比Postman更方便的接口调试工具HTTPie)