Отправка SMS через внешний сервис API

Добавьте timeout и обработку сетевых ошибок, проверьте авторизацию до отправки, уберите секреты из URL и логов. Успешный HTTP-ответ не равен доставленной SMS.

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

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

Добавьте timeout и обработку сетевых ошибок, проверьте авторизацию до отправки, уберите секреты из URL и логов. Успешный HTTP-ответ не равен доставленной SMS.

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

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

Условие

Код‑ревью: оценить устойчивость реализации и правильность обработки различных HTTP‑статусов.

import requests, json, logging
logger = logging.getLogger(__name__)

def send_sms_via_world(recipient: str, message: str) -> tuple:
    auth_url = 'https://my.it.com' + '/api/auth/login?email=it@it.in&password=password'
    auth_resp = requests.post(url=auth_url)
    token = auth_resp.json().get('access_token')

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

    send_url = 'https://my.it.com' + '/api/send'
    payload = {
        "type": "sms",
        "sender": "Sender",
        "body": str(message),
        "recipient": str(recipient)
    }

    hdrs = {
        'Authorization': f'Bearer {token}'
    }

    send_resp = requests.post(url=send_url, headers=hdrs, data=json.dumps(payload))

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

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

Ответ

Добавьте timeout и обработку сетевых ошибок, проверьте авторизацию до отправки, уберите секреты из URL и логов. Успешный HTTP-ответ не равен доставленной SMS.

Сейчас пароль находится в query string, а сырые ответы могут раскрыть токен и персональные данные. Передавайте credentials способом, предусмотренным API, из защищённой конфигурации; логируйте только безопасные коды и идентификаторы операции.

Проверяйте статус авторизации, структуру JSON и наличие токена. Для отправки используйте json=payload, timeout и единый тип результата. Учтите 401/403, 429, остальные 4xx/5xx и requests.Timeout: сетевой timeout не обязательно сопровождается HTTP 408.

Не повторяйте отправку SMS вслепую после неопределённого результата — она могла быть принята. Нужны idempotency key или запрос статуса. Конкретные успешные коды, например 200/202, определяются контрактом провайдера.

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

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

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

Подробнее