HTTP中使用最多的就是GET和POST这两种请求方式。掌握这两种请求方式的原理,以及两种请求方式的异同,也是之后做接口测试的一个重要基础。
1.GET和POST的区别
(1)请求方法不同
(2)POST可以附加body,可以支持Form、JSON、XML、Binary等数据格式
(3)从行业通用规范的角度来说,如果对数据库操作不会产生数据变化,如查询操作,建议使用GET,添加数据操作使用POST请求。
2.演示环境搭建
为了避免其他因素的干扰,下面使用Flask编写一个简单的演示程序,创建一个简易的服务。
(1)安装Flask
pip install flask
(2)创建一个hello.py文件
from flask import Flask, request
app = Flask(_name_)
@app.route('/')
def hello_world():
return 'hello,World!'
@app.route("/request",methods=['POST','GET'])
def hello():
#获取到request参数
query = requert.args
#获取到request form
post = request.from
#分别打印获取到参数和from
return f"query:{query}\n"\
f"post:{post}"
(3)启动服务
export FLASK_APP=hello.py
flask run
下面的信息表示服务搭建成功:
* Serving Flask app"hello.py"
* Environment: production
WARNING: Do not use the development server in a production enviroment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/(Press CTRL+C to quit)
3.用CURL发起GET和POST请求
发起GET请求,把a、b参数放入URL中发送,并保存在get文件中。
curl 'http://127.0.0.1:5000/request?a=1&b=2' -v -s &>get
发送POST请求,把a、b参数以form-data格式发送,并保存在post文件中。
curl 'http://1270.0.0.1:5000/request?' -d "a=1&b=2" -v -s &>post
GET和POST请求对比
注:>的右边为请求内容,<右边为响应内容
GET请求过程:
* Trying 127 0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127 0.0.1) port 5000(#0)
> GET /request?a=1&b=2 HTTP/1.1
> Host: 1270.0.0.1:5000
> User-Agent: curl/7.64.1
> Accept:*/*
>
* HTTP 1.0,assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charse=utf-8
< Content-Length: 80
< Server: Werkzeug/0.14.1 Python/3.7.5
< Date:Wed,01 Apr 2020 07 35:42 GMT
<
{ [80 bytes data]
*Closing connection 0
query: ImmutableMultiDict([('a','1'),('b','2')])
post: ImmutableMultiDit([])}
PODT请求过程:
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1(127.0.0.1) port 5000 (#0)
> POST /request?a=1&b=2 HTTP/1.1
> Host:127.0.0.1:5000
> User-Agent: curl/7.64.1
> Accept:*/*
> Content-Length:7
> Content-Type: application/x-www-form-urlencoded
>
} [7 bytes data]
* upload completely sent off: 7 out of 7 bytes
* HTTP 1.0,assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html;charset=utf-8
< Content-Length: 102
< Server: Werkzeug/0.14.1 Python /3.7.5
< Date: Web,01 Apr 2020 08:15:08 GMT
<
{ [102 bytes data ]
*Closing connection 0
query:ImmutableMultiDict([('a','b'),('b','2')])
post: ImmutableMultiDict([('c','3'),('d','4')])}
两个文件对比的结果如图6-25所示。
从图6-25中可以清除地看到,GET请求和POST请求用的请求方法不同,前者是GET请求,后者是POST请求。此外,GET请求中没有Content-Type和Content-Length这两个字段,而请求行中的“/request/?a=1&b=2” 带有query参数,是两种请求都允许的格式。