mirror of https://github.com/tiangolo/fastapi.git
✨ 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
This commit is contained in:
parent
5ffa18f10f
commit
b13a4baf32
|
|
@ -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"}
|
||||
|
|
|
|||
Loading…
Reference in New Issue