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