下面是request.post()函数部分的参数和它们的作用:
url
(必填):目标URL,即请求要发送到的地址。
data
(可选):要发送的数据。可以是字典、字节流、文件对象或字符串。这些数据将被包含在请求体中发送给目标URL。
json
(可选):要作为JSON发送的数据。可以直接传递Python对象,requests
库会自动将其转换为JSON格式并设置请求头的Content-Type
为application/json
。
headers
(可选):要在请求中附加的头部信息,以字典形式提供。
json.dumps()
是Python内置的JSON模块中的一个函数,用于将Python对象转换为JSON格式的字符串。下面是json.dumps()
函数的部分参数和它们的作用:
obj
(必填):要转换为JSON格式的Python对象。ensure_ascii
(可选):默认为True
。如果设置为True
,则所有非ASCII字符将转义为Unicode转义序列;如果设置为False
,则允许非ASCII字符原样输出。allow_nan
(可选):默认为True
。如果设置为True
,则允许JSON字符串包含NaN、Infinity和-Infinity;如果设置为False
,则会引发ValueError
。import requests
import json
if __name__ == '__main__':
my_data = [{
"adId": 1,
"country": "MYS",
"affiliate_id": "136",
"pcvr": 0.001711,
"pctr": 0.95
},
{
"adId": 2,
"country": "TWN",
"affiliate_id": "129",
"pcvr": 0.003089,
"pctr": 0.95
}]
res = requests.post("http://localhost:8000/model", data=json.dumps({"data": my_data}), timeout=10000)
#{"data":my_data}为python的字典对象,使用json.dumps()函数将其转化为json字符串
Pydantic模型是通过继承BaseModel类来创建的。
BaseModel
是Pydantic库中定义的基类,提供了许多有用的功能和属性,用于定义数据模型、验证和解析数据。当你定义一个Pydantic模型时,你需要从
BaseModel
继承,并根据你的需求定义模型的字段和类型。这些字段的类型可以是Pydantic内置的类型,也可以是自定义的类型。通过继承
BaseModel
,Pydantic模型继承了许多功能,包括:
数据验证:Pydantic模型使用字段的类型注解来验证数据的类型和格式。在创建模型的实例时,如果传入的数据无法验证通过,将引发
ValidationError
异常。数据解析:Pydantic模型可以将数据从不同的来源(例如JSON字符串、字典等)解析为模型的实例。这使得在处理请求时,可以方便地将输入数据解析为模型对象,以便进行进一步的操作和验证。
字段默认值:你可以为Pydantic模型定义字段的默认值,如果字段在数据中不存在,则使用默认值。
嵌套模型:Pydantic模型支持嵌套,你可以将其他Pydantic模型作为字段类型,从而创建出复杂的数据结构。
——chatgpt
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
import psutil
class BidInfor(BaseModel):
data: list
my_server = FastAPI()
@my_server.post('/model/LinBid')
async def get_bid_price(bid: BidInfor):
handler = LinBIdHandle() # 创建LinBIdHandle的实例
return handler.get_bid_price(bid.data) # 使用实例调用方法
在客户端请求代码中,使用json.dumps()
函数将一个字典对象转换为JSON格式的字符串,并作为POST请求的数据发送到服务器。其中,字典对象的结构是{"data": my_data}。
在服务端代码中,使用BidInfor
这个Pydantic模型(继承自BaseModel
)来验证接收到的POST请求的数据类型。根据代码中的定义,BidInfor
模型具有一个名为data
的字段,其类型是列表(list
)。
因此,bid.data
表示从客户端传递过来的JSON数据中的data
键对应的值,它应该是一个列表类型的数据。服务端会对接收到的数据进行验证,确保其符合BidInfor
模型的定义。
res = requests.post("http://localhost:8000/model", data=json.dumps({"data": my_data}), timeout=10000)
if res.status_code == 200:
print(res.headers)
res_json = res.json()
print(res_json)
else:
print("Request failed with status code:", res.status_code)
request对应的输出如下:
{'date': 'Tue, 28 Nov 2023 06:50:28 GMT', 'server': 'uvicorn', 'content-length': '158', 'content-type': 'application/json'}
{'data': [{'adId': 1, 'base_bid': 0.23257}, {'adId': 2, 'base_bid': 0.381}, {'adId': 3, 'base_bid': 0.561}, {'adId': 4, 'base_bid': 0.20865}], 'code': 200, 'version': '20231128'}
由于在服务端中使用了fastapi框架,会将返回值自动序列化为JSON格式的响应。使用res.json()
方法将其解析为Python对象。