前后端json数据传输(以post请求为例)

request.post()函数

下面是request.post()函数部分的参数和它们的作用:

  • url(必填):目标URL,即请求要发送到的地址。

  • data(可选):要发送的数据。可以是字典、字节流、文件对象或字符串。这些数据将被包含在请求体中发送给目标URL。

  • json(可选):要作为JSON发送的数据。可以直接传递Python对象,requests库会自动将其转换为JSON格式并设置请求头的Content-Typeapplication/json

  • headers(可选):要在请求中附加的头部信息,以字典形式提供。

 json.dumps()函数

 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

 post请求实例

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类

Pydantic模型是通过继承BaseModel类来创建的。

BaseModel是Pydantic库中定义的基类,提供了许多有用的功能和属性,用于定义数据模型、验证和解析数据。

当你定义一个Pydantic模型时,你需要从BaseModel继承,并根据你的需求定义模型的字段和类型。这些字段的类型可以是Pydantic内置的类型,也可以是自定义的类型。

通过继承BaseModel,Pydantic模型继承了许多功能,包括:

  1. 数据验证:Pydantic模型使用字段的类型注解来验证数据的类型和格式。在创建模型的实例时,如果传入的数据无法验证通过,将引发ValidationError异常。

  2. 数据解析:Pydantic模型可以将数据从不同的来源(例如JSON字符串、字典等)解析为模型的实例。这使得在处理请求时,可以方便地将输入数据解析为模型对象,以便进行进一步的操作和验证。

  3. 字段默认值:你可以为Pydantic模型定义字段的默认值,如果字段在数据中不存在,则使用默认值。

  4. 嵌套模型: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模型的定义。

post请求的返回response实例 

 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对象。

你可能感兴趣的:(json,fastapi)