FastAPI передает json в запрос на получение через TestClient - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь проверить API, который я написал с Fastapi. У меня есть следующий метод в моем маршрутизаторе:

@app.get('/webrecord/check_if_object_exist')
async def check_if_object_exist(payload: WebRecord) -> bool:
    key = get_key_of_obj(payload.data) if payload.key is None else payload.key
    return await check_if_key_exist(key)

и следующий тест в моем тестовом файле:

client = TestClient(app)
class ServiceTest(unittest.TestCase):
.....
    def test_check_if_object_is_exist(self):
        webrecord_json = {'a':1}
        response = client.get("/webrecord/check_if_object_exist", json=webrecord_json)
        assert response.status_code == 200
        assert response.json(), "webrecord should already be in db, expected : True, got : {}".format(response.json())

Когда я запустил код в отладке, я понял, что точки останова внутри метод get не достигнут. Когда я изменил тип запроса на публикацию, все работало нормально.

Что я делаю не так?

1 Ответ

1 голос
/ 23 апреля 2020

Чтобы отправить данные на сервер с помощью запроса GET, вам придется кодировать их в URL-адресе, поскольку у GET нет тела. Это не рекомендуется, если вам нужен определенный формат (например, JSON), так как вам придется анализировать URL-адрес, декодировать параметры и преобразовывать их в JSON.

В качестве альтернативы, вы можете POST a Поисковый запрос на ваш сервер. Запрос POST разрешает тело, которое может иметь различные форматы (включая JSON).

Если вы все еще хотите запрос GET

    @app.get('/webrecord/check_if_object_exist/{key}')
async def check_if_object_exist(key: str, data: str) -> bool:
    key = get_key_of_obj(payload.data) if payload.key is None else payload.key
    return await check_if_key_exist(key)


client = TestClient(app)
class ServiceTest(unittest.TestCase):
.....
    def test_check_if_object_is_exist(self):
        response = client.get("/webrecord/check_if_object_exist/key", params={"data": "my_data")
        assert response.status_code == 200
        assert response.json(), "webrecord should already be in db, expected : True, got : {}".format(response.json())

Это позволит получать запросы от mydmain url. com / webrecord / check_if_object_exist / {ключ объекта}.

Последнее замечание: я сделал все параметры обязательными. Вы можете изменить их, объявив по умолчанию None. См. fastapi Docs

...