Вызов внешнего API для отправки SMS

Код может зависнуть без timeout, раскрывает секреты в URL/логах и не обрабатывает большинство ошибок. Отправку SMS нельзя безусловно повторять: при неизвестном результате возможны дубли.

Короткий ответ

Что ответить на собеседовании

Код может зависнуть без timeout, раскрывает секреты в URL/логах и не обрабатывает большинство ошибок. Отправку SMS нельзя безусловно повторять: при неизвестном результате возможны дубли.

Подробный разбор

Ответ с пояснениями

Условие

Проведите ревью данного фрагмента кода, оцените его надёжность и корректность обработки различных HTTP‑статусов. Обратите внимание на процесс аутентификации, формирование запроса и логирование ответов.

def world_sms_send(receiver: str, text: str) -> tuple:
    url = 'https://my.it.com' + '/api/auth/login?email=it@it.in&password=password'
    r = requests.post(url=url)
    access_token = r.json().get('access_token')

    logger.warning(f'response it 1: {r.text}')

    url = 'https://my.it.com' + '/api/send'
    data = {
        "type": "sms",
        "sender": "Sender",
        "body": str(text),
        "recipient": str(receiver)
    }

    headers = {
        'Authorization': 'Bearer {}'.format(access_token)
    }

    r = requests.post(url=url, headers=headers, data=json.dumps(data))

    logger.warning(f'response it 2: {r.text}')

    if r.status_code == 200:
        return url, 0, r.status_code, r.json()
    elif r.status_code == 400:
        return url, 1, r.status_code, 'Bad request'
    elif r.status_code == 408:
        return url, 2, r.status_code, 'Time out in querying'
    elif r.status_code == 500:
        return url, -99, r.status_code, 'Internal Error. Please contact with your administrator.'

Ответ

Код может зависнуть без timeout, раскрывает секреты в URL/логах и не обрабатывает большинство ошибок. Отправку SMS нельзя безусловно повторять: при неизвестном результате возможны дубли.

Учётные данные храните вне кода и передавайте способом, предусмотренным API, не в query string. Не логируйте токен, телефон, текст SMS и сырые ответы. Используйте HTTPS, requests.Session, json=data и ограниченные connect/read timeouts.

Отдельно обработайте сетевой timeout, некорректный JSON, отсутствие токена и HTTP-ошибки. HTTP 408 не заменяет исключение локального таймаута. Успех определяет контракт провайдера: принятие сообщения ещё не означает доставку. Для 401 возможна ограниченная переавторизация; для 429 учитывайте Retry-After. Повтор отправки безопасен только при поддерживаемом ключе идемпотентности или проверке статуса. Во всех ветках возвращайте единый тип результата.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее