Browse Source
✨ Add better JSON decode error handling, improve feedback for client after invalid JSON requests (#1354 )
* Request body error, raise RequestValidationError instead of HTTPException in case JSON decode failure
* add missing test case for body general exception
pull/1576/head
Aviram Hassan
5 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
25 additions and
1 deletions
fastapi/routing.py
tests/test_tutorial/test_body/test_tutorial001.py
@ -1,5 +1,6 @@
import asyncio
import inspect
import json
from typing import Any , Callable , Dict , List , Optional , Sequence , Set , Type , Union
from fastapi import params
@ -177,6 +178,8 @@ def get_request_handler(
body_bytes = await request . body ( )
if body_bytes :
body = await request . json ( )
except json . JSONDecodeError as e :
raise RequestValidationError ( [ ErrorWrapper ( e , ( " body " , e . pos ) ) ] , body = e . doc )
except Exception as e :
raise HTTPException (
status_code = 400 , detail = " There was an error parsing the body "
@ -1,3 +1,5 @@
from unittest . mock import patch
import pytest
from fastapi . testclient import TestClient
@ -176,5 +178,24 @@ def test_post_body(path, body, expected_status, expected_response):
def test_post_broken_body ( ) :
response = client . post ( " /items/ " , data = { " name " : " Foo " , " price " : 50.5 } )
assert response . status_code == 400 , response . text
assert response . status_code == 422 , response . text
assert response . json ( ) == {
" detail " : [
{
" ctx " : {
" colno " : 1 ,
" doc " : " name=Foo&price=50.5 " ,
" lineno " : 1 ,
" msg " : " Expecting value " ,
" pos " : 0 ,
} ,
" loc " : [ " body " , 0 ] ,
" msg " : " Expecting value: line 1 column 1 (char 0) " ,
" type " : " value_error.jsondecode " ,
}
]
}
with patch ( " json.loads " , side_effect = Exception ) :
response = client . post ( " /items/ " , json = { " test " : " test2 " } )
assert response . status_code == 400 , response . text
assert response . json ( ) == { " detail " : " There was an error parsing the body " }