[SOLVED] FastAPI: How to Fix ‘422 Unprocessable Entity’ when sending a POST request using PHP

Issue

This Content is from Stack Overflow. Question asked by Hamidou

I am new in FastAPI and having issues by facing 422 Unprocessable Entity error message. I want to post Data by using PHP client but I receive msg”:”field required”,”type”:”value_error.missing” for all the fields. I am using a PHP client.
I can succesfully post data by using http://127.0.0.1:8000/docs#/ POST method. Thanks for your help.

{“detail”:[{“loc”:[“body”,”cin_numcedeao”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_prenom”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_nom”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_datenais”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_lieunais”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_sexe”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_taille”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_datedeliv”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_dateexp”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_centreenreg”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cin_adresse”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_numelec”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_region”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_depart”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_arrond”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_com”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_lieuvote”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_burvote”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”cel_nin”],”msg”:”field required”,”type”:”value_error.missing”},{“loc”:[“body”,”collect_cel_numelec”],”msg”:”field required”,”type”:”value_error.missing”}]}

Models

from sqlalchemy import Table, Column
from sqlalchemy.sql.sqltypes import Integer, String, DATETIME, Enum
from config.db import meta

parrain = Table(
    'parrain', meta,
    Column('id', Integer, primary_key=True),
    Column('cin_numcedeao', String(25)),
    Column('cin_prenom', String(100)),
    Column('cin_nom', String(100)),
    Column('cin_datenais', DATETIME),
    Column('cin_lieunais', String(100)),
    Column('cin_sexe', Enum('F', 'M')),
    Column('cin_taille', Integer),
    Column('cin_datedeliv', DATETIME),
    Column('cin_dateexp', DATETIME),
    Column('cin_centreenreg', String(255)),
    Column('cin_adresse', String(255)),
    Column('cel_numelec', String(20)),
    Column('cel_region', String(20)),
    Column('cel_depart', String(50)),
    Column('cel_arrond', String(50)),
    Column('cel_com', String(50)),
    Column('cel_lieuvote', String(100)),
    Column('cel_burvote', Integer),
    Column('cel_nin', String(25)),
    Column('collect_cel_numelec', String(20))
)

The schema

from datetime import datetime
from enum import Enum
from pydantic import BaseModel


class TypeEnum(str, Enum):
    F: str = 'F'
    M: str = 'M'


class Parrainage(BaseModel):
    cin_numcedeao: str
    cin_prenom: str
    cin_nom: str
    cin_datenais:  datetime
    cin_lieunais: str
    cin_sexe: TypeEnum
    cin_taille:  int
    cin_datedeliv:  datetime
    cin_dateexp:  datetime
    cin_centreenreg:  str
    cin_adresse:  str
    cel_numelec:  str
    cel_region:  str
    cel_depart: str
    cel_arrond:  str
    cel_com: str
    cel_lieuvote: str
    cel_burvote: int
    cel_nin:  str
    collect_cel_numelec: str

    class Config:
        orm_mode = True

The POST method

@parrainage.post("/parrain")
async def write_data(leparrain: Parrainage):
    conn.execute(parrain.insert().values(
        cin_numcedeao=leparrain.cin_numcedeao,
        cin_prenom=leparrain.cin_prenom,
        cin_nom=leparrain.cin_nom,
        cin_datenais=leparrain.cin_datenais,
        cin_lieunais=leparrain.cin_lieunais,
        cin_sexe=leparrain.cin_sexe,
        cin_taille=leparrain.cin_taille,
        cin_datedeliv=leparrain.cin_datedeliv,
        cin_dateexp=leparrain.cin_dateexp,
        cin_centreenreg=leparrain.cin_centreenreg,
        cin_adresse=leparrain.cin_adresse,
        cel_numelec=leparrain.cel_numelec,
        cel_region=leparrain.cel_region,
        cel_depart=leparrain.cel_depart,
        cel_arrond=leparrain.cel_arrond,
        cel_com=leparrain.cel_com,
        cel_lieuvote=leparrain.cel_lieuvote,
        cel_burvote=leparrain.cel_burvote,
        cel_nin=leparrain.cel_nin,
        collect_cel_numelec=leparrain.collect_cel_numelec
    ))
    return conn.execute(parrain.select()).fetchall()

My PHP client

<?php

$url = "http://127.0.0.1:8000/parrain";

 
$data_array =array(
    "cin_numcedeao" => str_replace(' ', '',$_POST["choice_cin_numcedeao"]),
    "cin_prenom" => $_POST["choice_cin_prenom"],
    "cin_nom" => $_POST["choice_cin_nom"],
    "cin_datenais" => $_POST["choice_cin_datenais"],
    "cin_lieunais" => $_POST["choice_cin_lieunais"],
    "cin_sexe" => $_POST["choice_cin_sexe"],
    "cin_taille" => intval($_POST["choice_cin_taille"]),
    "cin_datedeliv" => $_POST["choice_cin_datedeliv"],
    "cin_dateexp" => $_POST["choice_cin_dateexp"],
    "cin_centreenreg" => $_POST["choice_cin_centreenreg"],
    "cin_adresse" => $_POST["choice_cin_adresse"],
    "cel_numelec" => $_POST["choice_cel_numelec"],
    "cel_region" => $_POST["choice_cel_region"],
    "cel_depart" => $_POST["choice_cel_depart"],
    "cel_arrond" => $_POST["choice_cel_arrond"],
    "cel_com" => $_POST["choice_cel_com"],
    "cel_lieuvote" => $_POST["choice_cel_lieuvote"],
    "cel_burvote" => intval($_POST["choice_cel_burvote"]),
    "cel_nin" => str_replace(' ', '',$_POST["choice_cel_nin"]),
    "collect_cel_numelec" =>'11111111'  //$_POST["collect_cel_numelec"]
    );


$data = http_build_query($data_array);


$ch= curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
header('Content-Type: text/html');
$resp = curl_exec($ch);

if($e = curl_error($ch)){
    var_dump($e);
}
else{
    $decoded = json_decode($resp); // return an object
    foreach($decoded as $key => $val) {
        //echo $key . ':' . $val . '<br>';
        var_dump($key);
        var_dump($val);
    }
}
curl_close($ch);
?>



Solution

Thanks you, this post answer my question. Now it works.

$content = json_encode($data_array);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
        array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $content);

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ( $status != 201 ) {
    die("Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error($curl) . ", curl_errno " . curl_errno($curl));
}


curl_close($curl);

$response = json_decode($json_response, true);


This Question was asked in StackOverflow by Hamidou and Answered by Hamidou It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?