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



