POST请求响应422错误{'detail': [{'loc': ['body'], 'msg': 'value不是有效的dict', 'type': 'type_error.dict'}]}

问题描述 投票:0回答:2

我的

POST
请求继续失败,并出现
422
响应,即使正在发送有效的
JSON
。我正在尝试创建一个网络应用程序,该应用程序接收上传的带有各种遗传标记的文本文件,并将其发送到张量流模型以进行癌症生存预测。可以在here找到 github 项目的链接。

这是

POST
的要求:

 df_json = dataframe.to_json(orient='records')
 prediction = requests.post('http://backend:8080/prediction/', json=json.loads(df_json), headers={"Content-Type": "application/json"})

这是 pydantic 模型以及 API 端点:

class Userdata(BaseModel):
RPPA_HSPA1A : float
RPPA_XIAP : float
RPPA_CASP7 : float
RPPA_ERBB3 :float
RPPA_SMAD1 : float
RPPA_SYK : float
RPPA_STAT5A : float
RPPA_CD20 : float
RPPA_AKT1_Akt :float
RPPA_BAD : float
RPPA_PARP1 : float
RPPA_MSH2 : float
RPPA_MSH6 : float
RPPA_ACACA : float
RPPA_COL6A1 : float
RPPA_PTCH1 : float
RPPA_AKT1 : float
RPPA_CDKN1B : float
RPPA_GATA3 : float
RPPA_MAPT : float
RPPA_TGM2 : float
RPPA_CCNE1 : float
RPPA_INPP4B : float
RPPA_ACACA_ACC1 : float
RPPA_RPS6 : float
RPPA_VASP : float
RPPA_CDH1 : float
RPPA_EIF4EBP1 : float
RPPA_CTNNB1 : float
RPPA_XBP1 : float
RPPA_EIF4EBP1_4E : float
RPPA_PCNA : float
RPPA_SRC : float
RPPA_TP53BP1 : float
RPPA_MAP2K1 : float
RPPA_RAF1 : float
RPPA_MET : float
RPPA_TP53 : float
RPPA_YAP1 : float
RPPA_MAPK8 : float
RPPA_CDKN1B_p27 : float
RPPA_FRAP1 : float
RPPA_RAD50 : float
RPPA_CCNE2 : float
RPPA_SNAI2 : float
RPPA_PRKCA_PKC : float
RPPA_PGR : float
RPPA_ASNS : float
RPPA_BID : float
RPPA_CHEK2 : float
RPPA_BCL2L1 : float
RPPA_RPS6 : float
RPPA_EGFR : float
RPPA_PIK3CA : float
RPPA_BCL2L11 : float
RPPA_GSK3A : float
RPPA_DVL3 : float
RPPA_CCND1 : float
RPPA_RAB11A : float
RPPA_SRC_Src_pY416 :float
RPPA_BCL2L111 : float
RPPA_ATM : float
RPPA_NOTCH1 : float
RPPA_C12ORF5 : float
RPPA_MAPK9 : float
RPPA_FN1 : float
RPPA_GSK3A_GSK3B : float
RPPA_CDKN1B_p27_pT198 : float
RPPA_MAP2K1_MEK1 : float
RPPA_CASP8 : float
RPPA_PAI : float
RPPA_CHEK1 : float
RPPA_STK11 : float
RPPA_AKT1S1 : float
RPPA_WWTR1 : float
RPPA_CDKN1A : float
RPPA_KDR : float
RPPA_CHEK2_2 : float
RPPA_EGFR_pY1173 : float
RPPA_EGFR_pY992 : float
RPPA_IGF1R : float
RPPA_YWHAE : float
RPPA_RPS6KA1 : float
RPPA_TSC2 : float
RPPA_CDC2 : float
RPPA_EEF2 : float
RPPA_NCOA3 : float
RPPA_FRAP1 : float
RPPA_AR : float
RPPA_GAB2 : float
RPPA_YBX1 : float
RPPA_ESR1 : float
RPPA_RAD51 : float
RPPA_SMAD4 : float
RPPA_CDH3 : float
RPPA_CDH2 : float
RPPA_FOXO3 : float
RPPA_ERBB2_HER : float
RPPA_BECN1 : float
RPPA_CASP9 : float
RPPA_SETD2 : float
RPPA_SRC_Src_mv : float
RPPA_GSK3A_alpha : float
RPPA_YAP1_pS127 : float
RPPA_PRKCA_alpha : float
RPPA_PRKAA1 : float
RPPA_RAF1_pS338 : float
RPPA_MYC : float
RPPA_PRKAA1_AMPK : float
RPPA_ERRFI1_MIG : float
RPPA_EIF4EBP1_2 : float
RPPA_STAT3 : float
RPPA_AKT1_AKT2_AKT3 : float
RPPA_NF2 : float
RPPA_PECAM1 : float
RPPA_BAK1 : float
RPPA_IRS1 : float
RPPA_PTK2 : float
RPPA_ERBB3_2 : float
RPPA_FOXO3_a : float
RPPA_RB1_Rb : float
RPPA_MAPK14_p38 : float
RPPA_NFKB1 : float
RPPA_CHEK1_Chk1 : float
RPPA_LCK : float
RPPA_XRCC5 : float
RPPA_PARK7 : float
RPPA_DIABLO : float
RPPA_CTNNA1 : float
RPPA_ESR1_ER : float
RPPA_IGFBP2 : float
RPPA_STMN1 : float
RPPA_WWTR1_TAZ : float
RPPA_CASP3 : float
RPPA_JUN : float
RPPA_CCNB1 : float
RPPA_CLDN7 : float
RPPA_PXN : float
RPPA_RPS6KB1_p : float
RPPA_KIT : float
RPPA_CAV1 : float
RPPA_PTEN : float
RPPA_BAX : float
RPPA_SMAD3 : float
RPPA_ERBB2 : float
RPPA_MET_c : float
RPPA_ERCC1 : float
RPPA_MAPK14 : float
RPPA_BIRC2 : float
RPPA_PIK3R1 : float
RPPA_BCL2 : float
RPPA_PEA : float
RPPA_EEF2K : float
RPPA_RPS6KB1_p70 : float
RPPA_MRE11A : float
RPPA_KRAS : float
RPPA_ARID1A : float
RPPA_YBX1_yb : float
RPPA_NOTCH3 : float
RPPA_EIF4EBP1_3 : float
RPPA_XRCC1 : float
RPPA_ANXA1 : float
RPPA_CD49 : float
RPPA_SHC1 : float
RPPA_PDK1 : float
RPPA_EIF4E : float
RPPA_MAPK1_MAPK3 : float
RPPA_PTGS2 : float
RPPA_PRKCA : float
RPPA_EGFR_egfr : float
RPPA_RAB25 : float
RPPA_RB1 : float
RPPA_MAPK1 : float
RPPA_TFF1 : float
    
class config:
    orm_mode = True
        
@app.post("/prediction/")
async def create_item(userdata: Userdata):
    df = pd.DataFrame(userdata)
    y = model.predict(df)
    y = [0 if val < 0.5 else 1 for val in y]
    if y == 1:
        survival = 'You will survive.'
    if y == 0:
        survival = 'You will not survive.'
    return {'Prediction': survival}
python http-post fastapi pydantic http-status-code-422
2个回答
10
投票

在Python

requests
中,使用
JSON
参数发送
json
数据时,需要传入一个dict对象(例如
json={"RPPA_HSPA1A":30,"RPPA_XIAP":-0.902044768}
),
requests
会自动编码为
JSON
并设置
 Content-Type
标题至
application/json
。然而,在您的情况下,当您使用
to_json()
方法时,您获得的对象(即您定义的
df_json
)是一个
JSON
编码字符串(您可以通过打印出
type(df_json)
来验证) )。因此,您应该使用
to_dict()
方法,它返回一个字典。由于您使用的是
orient='records'
,因此返回的对象将是
list
dict
,因此,您需要从该
list
获取第一个元素。下面的例子:

data = dataframe.to_dict(orient='records')
payload = data[0]
prediction = requests.post('<URL_HERE>', json=payload)

否则,如果您使用

to_json()
方法,则在发布请求时需要使用
data
参数(请参阅文档此处),并且如前所述,因为您指定了返回的
records
的方向a
list
,您需要从该字符串中删除前导和尾随方括号。此外,使用此方法,您需要手动将
Content-Type
标题设置为
application/json
。下面的例子:

df_json = dataframe.to_json(orient='records')
payload = df_json.strip("[]")
prediction = requests.post('<URL_HERE>', data=payload, headers={"Content-Type": "application/json"})

2
投票

我在最低成本提要配方 API 中遇到了同样的问题,但我试图在邮递员中获取结果并从 React Native 调用 API,我通过在请求中查找标头解决了这个问题,之前

Content-Type
设置为有些
plain text
,我们需要告诉
Content-Type
是一个
application/json
,然后它才能正确响应

© www.soinside.com 2019 - 2024. All rights reserved.