这一节我们实现下面两个功能
- 自动判断服务器响应的状态码,如果状态码是4xx,5xx的话则认为请求失败
- 增加断言功能,可以判断响应的json字符串里是否包含预期的字段
为了测试方便,我们先在main.py文件中增加2个测试的接口
@app.route('/api')
def api():
return jsonify({'name': 'etf', 'version': '0.01'})
@app.route('/error')
def error():
codes = [404, 401, 403, 500]
random.shuffle(codes)
abort(codes[0])
- /api接口返回json字符串
{"name": "etf", "version": "0.01"}
- /error接口随机抛出401, 403, 404, 500错误中的1个
实现状态码自动判断
再修改handle_get()方法
def handle_get():
url = request.form['url']
try:
r = requests.get(url)
except Exception as e:
print(e)
r = None
resp = build_resp(r)
return render_template('home.html', resp=resp)
def build_resp(r):
resp = {'success': False}
if r is None:
return resp
if r.status_code < 400:
resp['success'] = True
resp['url'] = r.url
resp['text'] = r.text
resp['headers'] = r.headers
resp['status_code'] = r.status_code
return resp
这里我们新增了build_resp(r)方法,该方法的主要作用是判断请求响应的状态码,如果小于400就将请求成功状态设置为True。
下面修改前端页面home.html
ETF接口测试平台
{% if resp['success'] %}
接口地址: {{resp['url']}}
状态码: {{resp['status_code']}}
Headers
{% for key, value in resp['headers'].items() %}
{{key}}: {{value}}
{% endfor %}
Body
{{resp['text']}}
{% else %}
执行失败
状态码: {{resp['status_code']}}
响应: {{resp['text']}}
{% endif%}
上面主要的修改是回显get请求的url,另外如果请求是失败状态,就展示失败的信息。
修改完成后,使用/error接口进行测试,效果如下
实现断言
我们使用最偷懒最不安全的方式去实现断言,使用python的eval()方法,大家有兴趣可以自行了解一下。该方法主要的作用就是动态去执行一段python代码,是黑魔法,不安全,仅仅作为演示使用,大家不要在生产环境使用。
我们的设计是让用户在页面上输入一个断言表达式,也就是纯python代码。默认情况下我们将服务器返回的json字符串转换成python字典,并赋值给obj变量。简单理解的话就是服务器的返回会自动转成名为obj的字典对象,我们可以使用下面的语法来进行断言
- obj['name'] == 'tfl'
- obj['key'] == 'value'
- obj['key1']['key2'] == 'value1'
也就是提供1个python表达式,只要表达式返回的是boolean值就好了。
实现后效果如下,我们使用/api接口进行测试
上面我们测试了断言通过和失败的情况,一切如预期。
main.py中实现的核心代码其实很简单。
def handle_get():
url = request.form['url']
assertion = request.form['assert']
assertion_success = None
try:
r = requests.get(url)
if assertion is not None and assertion != '':
obj = r.json()
if assertion:
assertion_success = eval(assertion)
except Exception as e:
print(e)
r = None
resp = build_resp(r)
resp['assertion'] = assertion
resp['assertion_success'] = assertion_success
return render_template('home.html', resp=resp)
上面的代码里我们将用户输入的python表达式直接使用eval方法执行,如果表达式为真,则断言通过,否则失败。该方法很危险,大家可以去搜索一下为什么。
前端页面的核心修改如下
{% if resp['assertion_success'] is not none %}
{% if resp['assertion_success'] %}
断言成功
{% else %}
断言失败
{% endif %}
{{resp['assertion']}}
{% endif %}
判断断言执行的状态并给予相应的显示。
完整代码请点击这里
总结
- 状态码只要大于等于400我们就可以认为请求失败,大家可以去搜索一下为什么这样子?
- 使用eval()动态执行代码非常危险,因为用户可以输入任意代码,严重情况下这些代码可能导致你的服务器被黑客攻陷,所以在生产环境一定不要使用该方法。
- 永远不要相信用户输入,上面的代码只是演示,并没有什么实用价值。