Добавьте timeout и обработку сетевых ошибок, проверьте авторизацию до отправки, уберите секреты из URL и логов. Успешный HTTP-ответ не равен доставленной SMS.
Отправка SMS через внешний сервис API
Добавьте 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, определяются контрактом провайдера.