API代码实战
API实例一:
login.py文件
#!/usr/bin/env python
#!coding:utf-8 from flask import Flask,jsonify
from flask_restful import Api,Resource,reqparse app=Flask(__name__)
api=Api(app) class LoginView(Resource):
def get(self):
return {'status':0,'msg':'ok','data':'this is a login page'} def post(self):
parser=reqparse.RequestParser()
parser.add_argument('username', type=str, required=True, help='用户名不能为空')
parser.add_argument('password',type=str,required=True,help='账户密码不能为空')
parser.add_argument('age',type=int,help='年龄必须为正正数')
parser.add_argument('sex',type=str,help='性别只能是男或者女',choices=['女','男'])
args=parser.parse_args()
return jsonify(args) api.add_resource(LoginView,'/login',endpoint='login') if __name__ == '__main__':
app.run(debug=True,port=5000)
requestTest.py文件
import json import requests r=requests.get(
url='http://localhost:8888/hi/hello',
params={'name':'wuya'}
)
print('获取请求地址:',r.url)
print(r.text)
print(r.status_code)
print(r.headers)
print(r.content)
print(r.elapsed.total_seconds()) r=requests.post(
url='http://127.0.0.1:5000/login',
headers={'content-type':'application/json'},
data=json.dumps({'username':'lyl','sex':'女','age':'18','password':'123'})
) '''
1、当请求头的数据格式为application/json的时候,在post请求方法里面,请求参数使用json
2、当请求头的数据格式为application/json的时候,在post请求方法里面,请求参数使用data,但需要对请求参数进行序列
化的处理,如json.dumps(请求参数)
'''
print(r.status_code)
# print(r.headers)
print(r.json())
# print(json.dumps(r.json(),indent=True,ensure_ascii=False))
# print(r.text)
API实例二:
import json
import requests '''3、当请求数据格式为application/x-www-form-urlencoded,在post请求方法里面,请求参数使用data'''
r=requests.post(
url='https://www.lagou.com/jobs/v2/positionAjax.json',
params={'needAddtionalResult':False},
data={'first':'False','pn':2,'kd':'测试工程师'},
headers={'content-type':'application/json;charset=UTF-8',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'cookie':'user_trace_token=20210906103906-65bbbd6f-9e8e-4321-a96e-5f115f8463f7; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1630895946; _ga=GA1.2.1317827876.1630895947; LGUID=20210906103907-f70589f0-5dda-435c-9eca-075aecdfe049; LG_HAS_LOGIN=1; hasDeliver=0; privacyPolicyPopup=false; sajssdk_2015_cross_new_user=1; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; RECOMMEND_TIP=true; __SAFETY_CLOSE_TIME__22604012=1; _gid=GA1.2.1600152785.1630896153; gate_login_token=9d6759af759749588c6fa28c07a6b883ea1ab9a1c185db1d4eca844493eb3a35; index_location_city=%E5%85%A8%E5%9B%BD; LGSID=20210906172329-26b0ed28-7b04-4e5b-a7fb-5304cf5e43c6; PRE_UTM=m_cf_cpt_baidu_pcbt; PRE_HOST=; PRE_SITE=https%3A%2F%2Fwww.lagou.com%2Fwn%2Fresume%2FregisterComplete; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Flanding-page%2Fpc%2Fsearch.html%3Futm%5Fsource%3Dm%5Fcf%5Fcpt%5Fbaidu%5Fpcbt; WEBTJ-ID=20210906172604-17bba6dd3ac470-0e283bbb795d0f-c343365-1327104-17bba6dd3ad336; JSESSIONID=ABAAABAABEIABCI0CF59EE5096AF9E27F5DAAEABCD8A6CF; sensorsdata2015session=%7B%7D; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2222604012%22%2C%22first_id%22%3A%2217bb8fa0aea4c0-0bb9a32b499cff-c343365-1327104-17bb8fa0aeb96a%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24os%22%3A%22Windows%22%2C%22%24browser%22%3A%22Chrome%22%2C%22%24browser_version%22%3A%2292.0.4515.159%22%7D%2C%22%24device_id%22%3A%2217bb8fa0aea4c0-0bb9a32b499cff-c343365-1327104-17bb8fa0aeb96a%22%7D'
}
)
print(r.status_code)
print(json.dumps(r.json(),indent=True,ensure_ascii=False))
API实例三:
add.py
from flask import Flask,make_response,jsonify,abort,request
from flask_restful import Api,Resource
from flask_httpauth import HTTPBasicAuth # from skywalking import agent,config
# config.init(collector='http://localhost:8080/', service='saas') #采集服务的地址,给自己的服务起个名称
# config.flask_collect_http_params = True # flask接收到的http参数也保存
# agent.start() from flask import Flask
from flask_jwt import JWT, jwt_required, current_identity
from werkzeug.security import safe_str_cmp app=Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'super-secret'
api=Api(app=app)
auth=HTTPBasicAuth() @auth.get_password
def get_password(name):
if name=='admin':
return 'admin'
@auth.error_handler
def authoorized():
return make_response(jsonify({'msg':"请认证"}),403) books=[
{'id':1,'author':'wuya','name':'Python接口自动化测试实战','done':True},
{'id':2,'author':'无涯','name':'Selenium3自动化测试实战','done':False}
] class User(object):
def __init__(self, id, username, password):
self.id = id
self.username = username
self.password = password def __str__(self):
return "User(id='%s')" % self.id users = [
User(1, 'wuya', 'asd888'),
User(2, 'admin', 'asd888'),
User(3,'share','asd888')
] username_table = {u.username: u for u in users}
userid_table = {u.id: u for u in users} def authenticate(username, password):
user = username_table.get(username, None)
if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')):
return user def identity(payload):
user_id = payload['identity']
return userid_table.get(user_id, None) jwt = JWT(app, authenticate, identity) class Books(Resource):
# decorators = [auth.login_required]
decorators=[jwt_required()] def get(self):
return jsonify({'status':0,'msg':'ok','datas':books}) def post(self):
if not request.json:
return jsonify({'status':1001,'msg':'请求参数不是JSON的数据,请检查,谢谢!'})
else:
book = {
'id': books[-1]['id'] + 1,
'author': request.json.get('author'),
'name': request.json.get('name'),
'done': True
}
books.append(book)
return {'status':1002,'msg': '添加书籍成功','datas':book}
# return jsonify({'status':1002,'msg': '添加书籍成功','datas':book}, 201) class Book(Resource):
# decorators = [auth.login_required]
decorators = [jwt_required()] def get(self,book_id):
book = list(filter(lambda t: t['id'] == book_id, books))
if len(book) == 0:
return jsonify({'status': 1003, 'msg': '很抱歉,您查询的书的信息不存在'})
else:
return jsonify({'status': 0, 'msg': 'ok', 'datas': book}) def put(self,book_id):
book = list(filter(lambda t: t['id'] == book_id, books))
if len(book) == 0:
return jsonify({'status': 1003, 'msg': '很抱歉,您查询的书的信息不存在'})
elif not request.json:
return jsonify({'status': 1001, 'msg': '请求参数不是JSON的数据,请检查,谢谢!'})
elif 'author' not in request.json:
return jsonify({'status': 1004, 'msg': '请求参数author不能为空'})
elif 'name' not in request.json:
return jsonify({'status': 1005, 'msg': '请求参数name不能为空'})
elif 'done' not in request.json:
return jsonify({'status': 1006, 'msg': '请求参数done不能为空'})
elif type(request.json['done'])!=bool:
return jsonify({'status': 1007, 'msg': '请求参数done为bool类型'})
else:
book[0]['author'] = request.json.get('author', book[0]['author'])
book[0]['name'] = request.json.get('name', book[0]['name'])
book[0]['done'] = request.json.get('done', book[0]['done'])
return jsonify({'status': 1008, 'msg': '更新书的信息成功', 'datas': book}) def delete(self,book_id):
book = list(filter(lambda t: t['id'] == book_id, books))
if len(book) == 0:
return jsonify({'status': 1003, 'msg': '很抱歉,您查询的书的信息不存在'})
else:
books.remove(book[0])
return jsonify({'status': 1009, 'msg': '删除书籍成功'}) api.add_resource(Books,'/v1/api/books')
api.add_resource(Book,'/v1/api/book/<int:book_id>') if __name__ == '__main__':
app.run(debug=True)
(1)、requestTest.py文件
import request
import json
def login():
r=requests.post(
url='http://localhost:5000/auth',
json={"username":"wuya","password":"asd888"})
# print(r.json())
return r.json()['access_token'] def getAllBooks():
r=requests.get(
url='http://localhost:5000/v1/api/books',
headers={'Authorization':'jwt {0}'.format(login())})
print(r.text) # getAllBooks() def addBook():
r=requests.post(
url='http://localhost:5000/v1/api/books',
json={'name':'接口测试','author':'无涯课堂','done':True},
headers={'Authorization':'jwt {0}'.format(login())}
)
return r.json()['datas']['id'] addBook() def getBook():
r=requests.get(
url='http://localhost:5000/v1/api/book/{0}'.format(addBook()),
headers={'Authorization':'jwt {0}'.format(login())}
)
print(r.text) # getBook() def setBook():
r = requests.put(
url='http://localhost:5000/v1/api/book/{0}'.format(addBook()),
headers={'Authorization': 'jwt {0}'.format(login())},
json={'name': '接口测试', 'author': '无涯课堂', 'done': True}
)
print(json.dumps(r.json(),indent=True,ensure_ascii=False)) # setBook() def delBook():
r = requests.delete(
url='http://localhost:5000/v1/api/book/{0}'.format(addBook()),
headers={'Authorization': 'jwt {0}'.format(login())},
)
print(json.dumps(r.json(),indent=True,ensure_ascii=False)) delBook()
'''
动态参数解决思路:
1、执行上个接口后,拿到授权的返回值(token)
2、把获取到的上个接口的返回值传给下个接口的输入部分(请求头&请求参数)
'''
(2)test_pytest_api.py文件:
import requests
import json
import pytest url='http://localhost:5000' def token():
r=requests.post(
url=url+'/auth',
json={'username':'wuya','password':'asd888'}
)
return r.json()['access_token'] def getHeaders():
return {'Authorization': 'jwt {0}'.format(token())} def allBooks():
r = requests.get(
url=url + '/v1/api/books',
headers=getHeaders()
)
return r def addBook():
r = requests.post(
url=url + '/v1/api/books',
json={'name': '接口测试', 'author': '无涯课堂', 'done': True},
headers=getHeaders()
)
json.dump(r.json()['datas']['id'],open('bookID','w'))
return r def getBookID():
return json.load(open('bookID')) def getBook():
'''查看数据信息'''
r = requests.get(
url=url + '/v1/api/book/{0}'.format(getBookID()),
headers=getHeaders()
)
return r def delBook():
r = requests.delete(
url=url + '/v1/api/book/{0}'.format(getBookID()),
headers=getHeaders()
)
return r def test_get_book():
'''测试点:查看新添加书记的信息'''
addBook()
r=getBook()
delBook()
assert r.status_code==200
assert r.json()['status']==0
assert r.json()['datas'][0]['id']==int(getBookID()) def test_add_book():
'''测试点:查看新添加书记的信息'''
r=addBook()
delBook()
assert r.status_code==200
assert r.json()['status']==1002
assert r.json()['datas']['name']=='接口测试' def test_del_book():
'''测试点:查看新添加书记的信息'''
addBook()
r=delBook()
assert r.status_code==200
assert r.json()['status']==1009
assert len(allBooks().json()['datas'])==2 if __name__ == '__main__':
pytest.main(['-s','-v','test_pytest_api.py'])
(3)、test_unittest_api.py文件
import requests
import json
import unittest class ApiTest(unittest.TestCase):
url='http://localhost:5000' def token(self):
r=requests.post(
url=self.url+'/auth',
json={'username':'wuya','password':'asd888'}
)
return r.json()['access_token'] def getHeaders(self):
return {'Authorization': 'jwt {0}'.format(self.token())} def allBooks(self):
r = requests.get(
url=self.url + '/v1/api/books',
headers=self.getHeaders()
)
return r def addBook(self):
r = requests.post(
url=self.url + '/v1/api/books',
json={'name': '接口测试', 'author': '无涯课堂', 'done': True},
headers=self.getHeaders()
)
json.dump(r.json()['datas']['id'],open('bookID','w'))
return r def getBookID(self):
return json.load(open('bookID')) def getBook(self):
'''查看数据信息'''
r = requests.get(
url=self.url + '/v1/api/book/{0}'.format(self.getBookID()),
headers=self.getHeaders()
)
return r def delBook(self):
r = requests.delete(
url=self.url + '/v1/api/book/{0}'.format(self.getBookID()),
headers=self.getHeaders()
)
return r def test_get_book(self):
'''测试点:查看书记的信息'''
self.addBook()
r=self.getBook()
self.delBook()
self.assertEqual(r.status_code,200)
self.assertEqual(r.json()['status'],0)
self.assertEqual(r.json()['datas']['name'],'接口测试') def test_add_book(self):
'''测试点:查看新添加书记的信息'''
r=self.addBook()
self.delBook()
self.assertEqual(r.status_code,200)
self.assertEqual(r.json()['status'],1002)
self.assertEqual(r.json()['datas']['name'],'接口测试') def test_del_book(self):
'''测试点:查看删除书记的信息'''
self.addBook()
r=self.delBook()
self.assertEqual(r.status_code,200)
self.assertEqual(r.json()['status'],1009)
self.assertEqual(len(self.allBooks().json()['datas']),2)
API代码实战的更多相关文章
- 【WEB API项目实战干货系列】- API登录与身份验证(三)
上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...
- 【WEB API项目实战干货系列】- 接口文档与在线测试(二)
上一篇: [WEB API项目实战干货系列]- Web API 2入门(一) 这一篇我们主要介绍如何做API帮助文档,给API的调用人员介绍各个 API的功能, 输入参数,输出参数, 以及在线测试 A ...
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...
- Atitit.提升 升级类库框架后的api代码兼容性设计指南
Atitit.提升 升级类库框架后的api代码兼容性设计指南 1. 增加api直接增加,版本号在注释上面增加1 2. 废弃api,使用主见@dep1 3. 修改api,1 4. 修改依赖import, ...
- demo工程的清单文件及activity中api代码简单示例
第一步注册一个账户,并创建一个应用.获取app ID与 app Key. 第二步下载sdk 第三步新建工程,修改清单文件,导入相关的sdk文件及调用相应的api搞定. 3.1 修改清单文件,主要是加入 ...
- Hbase集群搭建及所有配置调优参数整理及API代码运行
最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过.这里将hbase配置参数进行相应 ...
- 【WEB API项目实战干货系列】- 导航篇(十足干货分享)
在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, Android APP, IOS APP, iPad APP, Hybired APP, H5 Web共用共同的 ...
- Scala 深入浅出实战经典 第64讲:Scala中隐式对象代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第63讲:Scala中隐式类代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
随机推荐
- Python中的文件处理和数据存储json
前言:每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此. 例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器 ...
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
- Nginx反向代理之巨坑underscores_in_headers
一.背景 因为项目需求,在做Windows的相关的事情:基本架构就是Nginx--> Nginx --> IIS,在Linux机器上通过Nginx做反向代理到Windows的IIS:然后遇 ...
- vue + WangEnduit
components 注册组件 <template lang="html"> <div class="editor"> <div ...
- JS013. 重写toFixed( )方法,toFixed()原理 - 四舍五入?银行家舍入法?No!六舍七允许四舍五入√!
以下为场景实测与原理分析,需要重写函数请直接滚动至页尾!!! 语法 - Number.prototype.toFixed( ) // toFixed()方法 使用定点表示法来格式化一个数值. numO ...
- Activiti 学习(三)—— Activiti 流程启动并完成
Activiti 流程启动 流程定义部署后,就可以通过工作流管理业务流程了,也就是说前文部署的出差申请流程可以使用了.针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于 java 类与 j ...
- Sentry Web 前端监控 - 最佳实践(官方教程)
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- ansible 批量安装yum包
1.首先安装一下ansible yum install ansible 2.修改一下ansible的参数以防ssh过去的时候需要首次判断yes 或者no sed -i 's/#host_key_ch ...
- python循环以及控制语句
python流程 学习完本篇,你将会通过python完成以下题目 试利用break语句求解2-100之间的素数. (1)素数是指除了能被1和它本身整除外,不能被其它数所整除的数.判断一个自然数是否是素 ...
- 重学VUE——vue 常用指令有哪些?
一.什么是指令? 在 vue 中,指令以 v- 开头,是一种特殊的自定义行间属性.指令属性的预期值是一个表达式,指令的职责就是:表达式的值改变时,相应地将某些行为应用到DOM上.只有v-for是一个类 ...