这一节咱们实现下面两个功能html
- 自动判断服务器响应的状态码,若是状态码是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()方法python
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。git
下面修改前端页面home.htmlgithub
<div class="container"> <h3 class="text text-center main-title">ETF接口测试平台</h3> <form action="/handle_get" method="post"> <div class="form-group"> {% if resp and resp['url'] %} <input type="text" name="url" id="url" placeholder="请输入URL" class="form-control" autofocus value="{{resp['url']}}"> {% else %} <input type="text" name="url" id="url" placeholder="请输入URL" class="form-control" autofocus> {% endif %} </div> <div class="form-group"> <input type="submit" name="submit" value="肯定" class="btn btn-primary"> </div> </form> <hr> {% if resp['success'] %} <p>接口地址: {{resp['url']}}</p> <p>状态码: {{resp['status_code']}}</p> <hr> <p>Headers</p> {% for key, value in resp['headers'].items() %} <p> <pre><code>{{key}}: {{value}}</code></pre> </p> {% endfor %} <hr> <p>Body</p> <pre> <code> {{resp['text']}} </code> </pre> {% else %} <p class="text text-danger">执行失败</p> <p class="text text-danger">状态码: {{resp['status_code']}}</p> <p class="text text-danger">响应: {{resp['text']}}</p> {% endif%} </div>
上面主要的修改是回显get请求的url,另外若是请求是失败状态,就展现失败的信息。json
修改完成后,使用/error接口进行测试,效果以下api
实现断言
咱们使用最偷懒最不安全的方式去实现断言,使用python的eval()方法,你们有兴趣能够自行了解一下。该方法主要的做用就是动态去执行一段python代码,是黑魔法,不安全,仅仅做为演示使用,你们不要在生产环境使用。安全
咱们的设计是让用户在页面上输入一个断言表达式,也就是纯python代码。默认状况下咱们将服务器返回的json字符串转换成python字典,并赋值给obj变量。简单理解的话就是服务器的返回会自动转成名为obj的字典对象,咱们可使用下面的语法来进行断言服务器
- obj['name'] == 'tfl'
- obj['key'] == 'value'
- obj['key1']['key2'] == 'value1'
也就是提供1个python表达式,只要表达式返回的是boolean值就行了。app
实现后效果以下,咱们使用/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'] %} <p><strong class="text text-success">断言成功</strong></p> {% else %} <p><strong class="text text-danger">断言失败</strong></p> {% endif %} <p><code>{{resp['assertion']}}</code></p> <hr> {% endif %}
判断断言执行的状态并给予相应的显示。
完整代码请点击这里
总结
- 状态码只要大于等于400咱们就能够认为请求失败,你们能够去搜索一下为何这样子?
- 使用eval()动态执行代码很是危险,由于用户能够输入任意代码,严重状况下这些代码可能致使你的服务器被黑客攻陷,因此在生产环境必定不要使用该方法。
- 永远不要相信用户输入,上面的代码只是演示,并无什么实用价值。