当前位置:   article > 正文

接口测试之RESTful_restful没有指定类型,如何在web栏测接口

restful没有指定类型,如何在web栏测接口

REST又被称为表征性状态传输,它是指客户端与服务端之间传输信息的一种方式。在REST中并没有严格的标准和规范,它只是规定了一套对通信的约束,当然它也存在一些指导的约束,也就是说客户端与服务端关注的是分离,只要API改变。常见的RESTful系统形式由JSON组成,每个资源位于自己的URL路径上,并使用不同的HTTP请求方法进行操作。在这里还是以具体的案例来说明这部分的应用,在无涯课堂里面添加课程的信息,获取所有课程的信息,以及获取某一个课程的信息,和对课程信息进行修改,以及删除课程的信息。需要安装的第三方的库为:flask-restful,flask-httpauth,flask,安装成功后,就实现具体的案例代码。

下面是添加课程信息,以及课程信息的操作,当然也添加了鉴权的认证方式(基本认证),见如下的源码:

  1. #!/usr/bin/env python
  2. # -*-coding:utf-8 -*-
  3. from flask import Flask,make_response,jsonify,abort,request
  4. from flask_restful import Api,Resource
  5. from flask_httpauth import HTTPBasicAuth
  6. app=Flask(__name__)
  7. api=Api(app=app)
  8. auth=HTTPBasicAuth()
  9. @auth.get_password
  10. def get_password(name):
  11. if name=='wuya':
  12. return 'admin'
  13. @auth.error_handler
  14. def authoorized():
  15. return make_response(jsonify({'msg':"请认证"}),401)
  16. @app.errorhandler(404)
  17. def not_found(error):
  18. return make_response(jsonify({'msg':'很抱歉,您访问的页面不存在'}))
  19. books=[
  20. {'id':1,'author':'wuya','name':'Python接口自动化测试实战','done':True},
  21. {'id':2,'author':'无涯','name':'Selenium3自动化测试实战','done':False}
  22. ]
  23. @app.route('/v1/api/books',methods=['GET'])
  24. @auth.login_required
  25. def get_books():
  26. return jsonify(books)
  27. @app.route('/v1/api/books',methods=['POST'])
  28. @auth.login_required
  29. def create_books():
  30. if not request.json:
  31. abort(400)
  32. else:
  33. book={
  34. 'id':books[-1]['id']+1,
  35. 'author':request.json.get('author'),
  36. 'name':request.json.get('name'),
  37. 'done':True
  38. }
  39. books.append(book)
  40. return jsonify({'msg':'created ok '},201)
  41. @app.route('/v1/api/book/<int:book_id>',methods=['GET'])
  42. @auth.login_required
  43. def get_book(book_id):
  44. book=list(filter(lambda t:t['id']==book_id,books))
  45. if len(book)==0:
  46. abort(404)
  47. else:
  48. return jsonify({'status':0,'msg':'ok','datas':book})
  49. @app.route('/v1/api/book/<int:book_id>',methods=['DELETE'])
  50. @auth.login_required
  51. def delete_book(book_id):
  52. book=list(filter(lambda t:t['id']==book_id,books))
  53. if len(book)==0:
  54. abort(404)
  55. else:
  56. books.remove(book[0])
  57. return jsonify({'status':1001,'msg':'课程信息已经删除成功'})
  58. @app.route('/v1/api/book/<int:book_id>',methods=['PUT'])
  59. @auth.login_required
  60. def update_book(book_id):
  61. book=list(filter(lambda t:t['id']==book_id,books))
  62. if len(book)==0:
  63. abort(404)
  64. elif not request.json:
  65. abort(400)
  66. elif 'author' not in request.json and 'name' not in request.json:
  67. abort(400)
  68. elif 'done' not in request.json and type(request.json['done']) is not bool:
  69. abort(400)
  70. else:
  71. book[0]['author']=request.json.get('author',book[0]['author'])
  72. book[0]['name'] = request.json.get('name', book[0]['name'])
  73. book[0]['done'] = request.json.get('done', book[0]['done'])
  74. return jsonify({'status':1002,'msg':'课程信息更新成功','dats':book})
  75. if __name__ == '__main__':
  76. app.run(debug=True)

在上面的案例代码中,定义了基础的员数据books,下来就是一系列的业务操作,每个业务操作都指定了访问URL地址,在每个业务上面都增加了基本的认证信息,也就意味着用户需要访问这些信息,需要经过认证。启动服务后,获取所有的课程信息,见如下的截图信息:

其它的API就不再演示,对上面的代码进行改造,使用类的方式编写,定义的类必须继承Response类,在类中依据业务的操作编写不同的方法,比很添加课程信息POST请求,获取课程信息GET方法,见修改后的源码:

  1. #!/usr/bin/env python
  2. # -*-coding:utf-8 -*-
  3. from flask import Flask,make_response,jsonify,abort,request
  4. from flask_restful import Api,Resource
  5. from flask_httpauth import HTTPBasicAuth
  6. app=Flask(__name__)
  7. api=Api(app=app)
  8. auth=HTTPBasicAuth()
  9. @auth.get_password
  10. def get_password(name):
  11. if name=='admin':
  12. return 'admin'
  13. @auth.error_handler
  14. def authoorized():
  15. return make_response(jsonify({'msg':"请认证"}),401)
  16. books=[
  17. {'id':1,'author':'wuya','name':'Python接口自动化测试实战','done':True},
  18. {'id':2,'author':'无涯','name':'Selenium3自动化测试实战','done':False}
  19. ]
  20. class Books(Resource):
  21. decorators = [auth.login_required]
  22. def get(self):
  23. return jsonify(books)
  24. def post(self):
  25. if not request.json:
  26. abort(400)
  27. else:
  28. book = {
  29. 'id': books[-1]['id'] + 1,
  30. 'author': request.json.get('author'),
  31. 'name': request.json.get('name'),
  32. 'done': True
  33. }
  34. books.append(book)
  35. return jsonify({'msg': 'created ok '}, 201)
  36. class Book(Resource):
  37. decorators = [auth.login_required]
  38. def get(self,book_id):
  39. book = list(filter(lambda t: t['id'] == book_id, books))
  40. if len(book) == 0:
  41. abort(404)
  42. else:
  43. return jsonify({'status': 0, 'msg': 'ok', 'datas': book})
  44. def post(self,book_id):
  45. book = list(filter(lambda t: t['id'] == book_id, books))
  46. if len(book) == 0:
  47. abort(404)
  48. elif not request.json:
  49. abort(400)
  50. elif 'author' not in request.json and 'name' not in request.json:
  51. abort(400)
  52. elif 'done' not in request.json and type(request.json['done']) is not bool:
  53. abort(400)
  54. else:
  55. book[0]['author'] = request.json.get('author', book[0]['author'])
  56. book[0]['name'] = request.json.get('name', book[0]['name'])
  57. book[0]['done'] = request.json.get('done', book[0]['done'])
  58. return jsonify({'status': 1002, 'msg': '更新课程信息成功', 'dats': book})
  59. def post(self,book_id):
  60. book = list(filter(lambda t: t['id'] == book_id, books))
  61. if len(book) == 0:
  62. abort(404)
  63. else:
  64. books.remove(book[0])
  65. return jsonify({'status': 1001, 'msg': '课程的信息已经删除成功'})
  66. api.add_resource(Books,'/v1/api/books')
  67. api.add_resource(Book,'/v1/api/book/<int:book_id>')
  68. if __name__ == '__main__':
  69. app.run(debug=True)

修改的代码和上面的没多少差异,唯一不同的是通过类的方式编写,维护起来更加简单高效,依据业务的方法在类的方法中编写不同的业务就可以了。可能细心的同学注意到,修改课程信息和删除课程信息,我并没有使用PUT请求方法和DELETE请求方法,而是使用的是POST请求方法。这是因为HTTP/1.1的PUT方法和DELETE方法自身不带验证机制,任何人都可以对服务端进行操作,存在安全性的问题,因此一般不建议使用。当然如果配合WEB应用程序的验证机制,就可能开放使用PUT方法和DELETE方法。通过上面的案例代码,实现了一个简单的业务操作。在实际的工作应用中,可能会涉及到模拟程序,那么就可以使用flask-restful来进行应用,也可以采用unittest框架里面的mock,就看个人喜好而已。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/906880
推荐阅读
相关标签
  

闽ICP备14008679号