fastapi获取请求参数

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数据传包含数据的类。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值