IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 接口学习(1) -> 正文阅读

[开发工具]接口学习(1)

学习FASTAPI接口调用

什么是接口

接口,后端传数据给前端的一个桥梁。
接口地址一般是一个http(url)

接口展示

代码中,接口由url和请求方式构成(get请求、post请求)
get请求:

# 当下绝大部分的接口是HTTP
# 少部分接口 RPC 远程过程调用

# RPC 是一个接口的请求过程
from fastapi import FastAPI

app = FastAPI()

def add(a,b): #RPC提供的功能
    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}
# res = add(1,2) #本地调用

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): #RPC提供的功能
    return a + b

总结

相当于提供一个接口
当客户端请求接口地址:/add_by_get
就会执行本函数,实现远程调用add
:return

GET 和 POST 区别:

● 请求方法不一样(HTTP请求头)
● 参数
- GET参数通过查询字符串(HTTP请求头)
在这里插入图片描述
- POST
- 参数通过json(HTTP正文)
在这里插入图片描述
- 参数通过查询字符串(HTTP请求头)
在这里插入图片描述

接口的安全性

接口的安全,一定是基于密码学,而不是HTTP请求方法

  • HTTPS
  • 接口加密和签名

什么是幂等和不幂等

幂等:

  • 请求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='密码错误')
#生成token,应该是安全的,要使用密码学
    return {"token":create_token(login_info.username)}

# res = add(1,2) #本地调用

定义一个libs文件,使用JWT中的密码学加密

import datetime
from jose import JWT

KEY = "djhiscojscojsdcjsdc" #随机内容,作为加密的key
TOKEN_EXPORE = 60 *24 *7 #token有效期 一周

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')))):
    # 根据token,解析用户信息
    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
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:20:15  更:2022-10-31 12:20:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:22:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码