学习FASTAPI接口调用
什么是接口
接口,后端传数据给前端的一个桥梁。 接口地址一般是一个http(url)
接口展示
代码中,接口由url和请求方式构成(get请求、post请求) get请求:
from fastapi import FastAPI
app = FastAPI()
def add(a,b):
return a + b
@app.get("/")
def index():
return {"msg": "Hello,world"}
@app.get("/add_by_get")
def add_get():
c = add(1,2)
return {"c":c}
post请求: 将@app.get("/add_by_get") #接口地址 部分替换为
@app.post("/add_by_post")
def add_post():
c = add(1,2)
return {"c":c}
运行:
uvicorn main:app --reload
网页上的网址: 这就是一个接口(使用postman进行测试) 一般使用postman进行接口测试,因为网页上一般是默认get请求,post请求会爆错。
接口调用过程详解
针对get请求,接口调用的过程可以分为三个部分
1、先到@app.get("/add_by_get") #接口地址 发送HTTP请求
2、执行接口逻辑c = add(1,2)
3、调用add函数
def add(a,b):
return a + b
总结
相当于提供一个接口 当客户端请求接口地址:/add_by_get 就会执行本函数,实现远程调用add :return
GET 和 POST 区别:
● 请求方法不一样(HTTP请求头) ● 参数 - GET参数通过查询字符串(HTTP请求头) - POST - 参数通过json(HTTP正文) - 参数通过查询字符串(HTTP请求头)
接口的安全性
接口的安全,一定是基于密码学,而不是HTTP请求方法
什么是幂等和不幂等
幂等:
- 请求N次,效果一样
幂等的例子:删除ID=1的文章 不幂等的例子:注册账号,使用POST - 浏览器通过POST知道这个请求不幂等,不会重复发送
接口鉴权
接口最重要的四个要素:接口的地址,请求方式,参数和接口的返回值 定义一个login接口,临时定义一个用户(不使用数据库)
_data = {
'user':{
"username":"beifan",
"password":"123123"
}
}
@app.post("/login")
def login(login_info:LoginInfo):
if login_info.username != _data['user']['username']:
raise HTTPException(status_code=400,detail='用户名错误')
if login_info.password != _data['user']['password']:
raise HTTPException(status_code=400, detail='密码错误')
return {"token":create_token(login_info.username)}
定义一个libs文件,使用JWT中的密码学加密
import datetime
from jose import JWT
KEY = "djhiscojscojsdcjsdc"
TOKEN_EXPORE = 60 *24 *7
def create_token(username:str):
d = {
"useername": username,
"exp": datetime.datetime.utcnow()+datetime.timedelta(minutes=TOKEN_EXPORE)
}
encoded = JWT.encode(d,KEY,algorithm='HS256')
return encoded
其中安装jose的方法pip install python-jose 利用postman测试,得到如下结果: 上图得到的就是我们使用jwt后,这个用户得到的token值
如何使用token保护接口
from fastapi import FastAPI, HTTPException, Depends
@app.post("/add_by_post")
def add_post(a:int,b:int,user:str = Depends(get_user)):
c = add(a,b)
return {"c":c}
def get_user(token:str= Depends((OAuth2PasswordBearer(tokenUrl='/login')))):
try:
d = jwt.decode(token,KEY,algorithms='HS256')
username = d.get("username","-1")
except(jwt.JWTError, ):
raise HTTPException(status_code=403,detail='token鉴权失败')
if username == '-1':
raise HTTPException(status_code=400,detail='用户信息有误')
return username
|