fastapi实现常用接口

举报
林欣 发表于 2024/12/20 10:32:32 2024/12/20
【摘要】 在HTTP协议中,除了GET和POST请求之外,还有多种其他类型的HTTP请求方法,每种方法都有其特定的用途和语义。常见的HTTP请求方法包括:GET:请求从服务器获取资源。POST:向服务器提交数据,通常用于提交表单或上传文件。PUT:向服务器上传或更新资源,通常用于创建或更新资源。DELETE:请求服务器删除资源。PATCH:对资源进行部分更新。HEAD:类似于GET请求,但只返回响应头...

在HTTP协议中,除了GET和POST请求之外,还有多种其他类型的HTTP请求方法,每种方法都有其特定的用途和语义。常见的HTTP请求方法包括:

  1. GET:请求从服务器获取资源。
  2. POST:向服务器提交数据,通常用于提交表单或上传文件。
  3. PUT:向服务器上传或更新资源,通常用于创建或更新资源。
  4. DELETE:请求服务器删除资源。
  5. PATCH:对资源进行部分更新。
  6. HEAD:类似于GET请求,但只返回响应头,不返回响应体。
  7. OPTIONS:请求服务器返回该资源所支持的HTTP请求方法的列表。
  8. TRACE:沿着到目标资源的路径,将请求和响应返回给客户端(主要用于测试和诊断)。
  9. CONNECT:将请求连接转换为透明的TCP/IP隧道(通常用于HTTPS代理)。

在FastAPI中,你可以很方便地定义这些不同的HTTP方法。下面是一个简单的例子,展示如何用FastAPI实现这些接口:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

# 示例数据模型
class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

# 初始化一个示例数据库(字典)
fake_items_db = {}

# GET 请求
@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int, q: str = None):
    item = fake_items_db.get(item_id)
    if item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    if q:
        return {**item, "description": f"{item['description']} (q={q})"}
    return item

# POST 请求
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    item_id = len(fake_items_db) + 1
    fake_items_db[item_id] = item
    return {"item_id": item_id, **item}

# PUT 请求
@app.put("/items/{item_id}", response_model=Item)
async def update_item(item_id: int, item: Item):
    if item_id not in fake_items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    fake_items_db[item_id] = item
    return item

# DELETE 请求
@app.delete("/items/{item_id}")
async def delete_item(item_id: int):
    if item_id not in fake_items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    del fake_items_db[item_id]
    return {"result": "success"}

# PATCH 请求
@app.patch("/items/{item_id}", response_model=Item)
async def patch_item(item_id: int, item: Item):
    if item_id not in fake_items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    update_data = item.dict(exclude_unset=True)
    fake_items_db[item_id].update(update_data)
    return fake_items_db[item_id]

# HEAD 请求
@app.head("/items/{item_id}")
async def read_item_head(item_id: int):
    item = fake_items_db.get(item_id)
    if item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    # HEAD 请求不需要返回内容,只设置响应头即可
    return Response(status_code=200)

# OPTIONS 请求
@app.options("/items/")
async def read_items_options():
    # OPTIONS 请求通常不需要返回复杂的内容,这里只是演示
    return {"allow": ["GET", "POST", "OPTIONS"]}

# TRACE 请求通常用于测试和诊断,FastAPI 默认不直接支持 TRACE 请求,
# 但你可以通过中间件或自定义路由来实现。
# 这里仅展示概念,不实现具体的 TRACE 请求。

# CONNECT 请求通常用于HTTPS代理,不在FastAPI的应用范围内。

# 启动应用
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

请注意,上述代码中的HEAD请求直接返回了一个空的Response对象,因为HEAD请求不需要返回响应体。对于OPTIONS请求,它返回了允许的HTTP方法列表。而TRACECONNECT请求在实际应用中并不常用,且FastAPI默认不直接支持TRACE请求,CONNECT请求通常用于HTTPS代理,不在FastAPI的应用范围内。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。