Код может зависнуть без timeout, раскрывает секреты в URL/логах и не обрабатывает большинство ошибок. Отправку SMS нельзя безусловно повторять: при неизвестном результате возможны дубли.
Вызов внешнего API для отправки 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. Повтор отправки безопасен только при поддерживаемом ключе идемпотентности или проверке статуса. Во всех ветках возвращайте единый тип результата.