LINUX.ORG.RU

разнообразие response в openapi

 , ,


0

1

Использую https://github.com/tiangolo/fastapi для построения api и документации openapi (он умеет из коробки это делать и выводить в swagger ui) Есть роут с кодом:

@router.post('/auth')
def create_user(user: UserSchemas.UserBase, db: Session = Depends(get_db)):
    # check user for waiting sms
    user_waiting_sms = \
        user_crud.get_user_sms_wait(db, number=user.number, is_active=False)
    if user_waiting_sms is not None and user_waiting_sms.sms_id is not None:
        # if we waiting sms
        if user_waiting_sms.expire_sms > int(time()):
            return {'status': 1, 'msg': 'Wait for sms code'}
        else:
            user_crud.reset_expire_sms(db, number=user.number)
            r = alphasms(user.number, 'test1', 'privet test1')
            if 'id' in r:
                user_crud.update_user_sms_expire(
                        db, number=user.number, sms_id=r['id'], expire_sms=(int(time())+300))
                return {'status': 2, 'msg': 'Sms code is resend'}
            else:
                raise HTTPException(status_code=202, detail="Error send message")
После запуска сервера имеем в сгенеренной документации https://i.imgur.com/ABEhOd7.png
видно что response и validation error по дефолту установлены, окей.
Вопрос заключается в том, разве в openapi спецификации не предусмотрено что ответов может быть несколько ? Успех либо нет, так же несколько ошибок валидации? И как вообще это правильно описывать?

предусмотрено. https://swagger.io/docs/specification/describing-responses/

          responses:
            '200':
              description: OK
            '400':
              description: Bad request. User ID must be an integer and larger than 0.
            '401':
              description: Authorization information is missing or invalid.
            '404':
              description: A user with the specified ID was not found.
            '5XX':
              description: Unexpected error.
bvn13 ★★★★★
()

Непонятно только зачем такой апи делать. Клиент не вы пишете? Стоанно заставлять клиент смотреть и в http статус и в статус внутри тела ответа. А если захотите поменять транспорт на protobuf?

anonymous
()
Ответ на: комментарий от anonymous

не я пишу, разве клиенту не будет удобно знать какой ответ он получит при ошибке валидации или еще чего нибудь ?
К примеру если 200х ответов может быть несколько по разным причинам с разным содержимым

noname_user ★★★
() автор топика
Последнее исправление: noname_user (всего исправлений: 1)
Ответ на: комментарий от anonymous

к примеру, как мне описать эти ответы? и правильно я делаю по спецификации openapi?

@router.post('/auth'})
def create_user(user: UserSchemas.UserBase, db: Session = Depends(get_db)):
    # check user for waiting sms
    user_waiting_sms = \
        user_crud.get_user_sms_wait(db, number=user.number, is_active=False)
    if user_waiting_sms is not None and user_waiting_sms.sms_id is not None:
        # if we waiting sms
        if user_waiting_sms.expire_sms > int(time()):
            return {'status': 1, 'msg': 'Wait for sms code'}
        else:
            user_crud.reset_expire_sms(db, number=user.number)
            #r = alphasms(user.number, 'test1', 'privet test1')
            r = []
            r['id'] = 1
            if 'id' in r:
                user_crud.update_user_sms_expire(
                        db, number=user.number, sms_id=r['id'], expire_sms=(int(time())+300))
                return {'status': 1, 'msg': 'Sms code is resend'}
            else:
                return JSONResponse(status_code=202, content={"message": "Error send sms"})

noname_user ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.