fastapi获取请求参数

本文详细介绍了FastAPI中GET和POST请求的参数处理。GET请求中,通过设置默认值避免了参数缺失的错误;POST请求使用Pydantic模型定义数据结构,展示了如何处理请求体数据。同时,文章探讨了客户端发送POST请求时json与data的区别,并提供了测试示例。
摘要由CSDN通过智能技术生成
GET

代码:

from fastapi import FastAPI, Request
import uvicorn
import time
import requests
​
app = FastAPI()
​
@app.get("/test")
def test(parameter: str = ''):
    rdat = "default"
    if parameter != "":
        rdat = 'Get value: '+ parameter
    return rdat
​
if __name__ == '__main__':
    uvicorn.run(app='main:app', host='0.0.0.0', port=8811,
                proxy_headers=True, forwarded_allow_ips='*',reload=True)
​

测试结果:

访问:http://127.0.0.1:8811/test
响应:"default"
​
访问:http://127.0.0.1:8811/test?parameter
响应:"default"
​
访问:http://127.0.0.1:8811/test?parameter=12
响应:"Get value: 12"
​
访问:http://127.0.0.1:8811/test?parameter=%2256%22
响应:"Get value: \"56\""

报错&解析:

  • 如下代码:

# ...
def test(parameter: str = ''):
    rdat = "default"
    # ...
  • 里面的parameter: str = ''实际是在指定`parameter的类型和默认值。

  • 如果写成这样:

# ...
def test(parameter: str):
    rdat = "default"
    # ...
  • 也能运行,但如果这时候请求里没有parameter这个参数,就会报错:

{"detail":[{"loc":["query","parameter"],"msg":"field required","type":"value_error.missing"}]}
  • 以下是测试:

访问:http://127.0.0.1:8811/test
响应:{"detail":[{"loc":["query","parameter"],"msg":"field required","type":"value_error.missing"}]}
​
访问:http://127.0.0.1:8811/test?parameter
响应:"default"

POST

代码

  • 服务端:

from fastapi import FastAPI, Request
import uvicorn
import time
import requests
from pydantic import BaseModel
​
app = FastAPI()
​
class hkk(BaseModel):
    parameter: str
    i: int
​
@app.post("/post1")
def post1(item: hkk,t1:str=''):
    print(item)
    print(item.i)
    print(t1)
    return item
​
if __name__ == '__main__':
    uvicorn.run(app='main:app', host='0.0.0.0', port=8811,
                proxy_headers=True, forwarded_allow_ips='*',reload=True)
  • 客户端:

import requests
​
url = 'http://127.0.0.1:8811/post1?t1=75'
​
dat = {
    'parameter':'abc',
    'i':12
}
r = requests.post(url=url,json=dat)
​
print(r.text)

测试结果:

  • 服务端

INFO:     Will watch for changes in these directories: ['D:\\']
INFO:     Uvicorn running on http://0.0.0.0:8811 (Press CTRL+C to quit)
INFO:     Started reloader process [19520] using statreload
INFO:     Started server process [15068]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
parameter='abc' i=12
12
75
INFO:     127.0.0.1:1765 - "POST /post1?t1=75 HTTP/1.1" 200 OK
  • 客户端:

{"parameter":"abc","i":12}

报错&解析:

  • 客户端下面这句:

r = requests.post(url=url,json=dat)
  • 如果是写成这样:

r = requests.post(url=url,data=dat)
  • 就会报如下错误:

INFO:     127.0.0.1:1442 - "POST /post1 HTTP/1.1" 422 Unprocessable Entity

一些需要注意的地方

  • 服务端可以用下面这种方法指定默认值:

# ....

class hkk(BaseModel):
    parameter: str = ""
    i: int = 0

# ....
  • 客户端测试代码 - 1:

import requests

url = 'http://127.0.0.1:8811/post1?t1=75'

dat = {}
r = requests.post(url=url,json=dat)

print(r.text)
  • 客户端测试代码 - 2:

import requests

url = 'http://127.0.0.1:8811/post1?t1=75'

dat = {}
r = requests.post(url=url)

print(r.text)
  • 测试结果

客户端测试代码 - 1:
正常返回默认值
-----------------------
客户端测试代码 - 2:
报错,返回:{"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}
控制台显示:INFO:     127.0.0.1:1169 - "POST /post1?t1=75 HTTP/1.1" 422 Unprocessable Entity

总结

  • url参数传参数名,post数据传包含数据的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值