Как посмотреть и подменить ответ с сервера в приложении
Что проверяют
Умеете ли вы отлаживать сетевой слой без помощи бэкенда: посмотреть реальный трафик и воспроизвести редкий ответ сервера вроде ошибки или пустого списка. Следом часто спрашивают про HTTPS: почему прокси не видит запросы приложения.
Как отвечать
Разделите задачу на случаи, для каждого свой инструмент:
- Network Inspector в Android Studio: вкладка App Inspection, показывает запросы через OkHttp и
HttpURLConnectionв debug-сборке вместе с заголовками и телом. В его правилах можно подменить код ответа, заголовки и тело на лету; - прокси на компьютере: Charles, Proxyman или mitmproxy. Устройство ходит через прокси, ответы меняются через Map Local, Rewrite или точки останова;
- Chucker: интерцептор OkHttp, который сохраняет трафик и показывает его на самом устройстве. Удобен тестировщикам, подключается через
debugImplementation, в релизе его заменяет пустая no-op версия; - свой
Interceptor: в debug-сборке возвращает подготовленный JSON вместо похода в сеть, выручает, пока бэкенд не готов; - MockWebServer в тестах: поднимает локальный сервер, ответы кладутся через
enqueue, а в Retrofit передаётсяserver.url("/")какbaseUrl. ЧерезtakeRequest()проверяется и то, какой запрос ушёл.
Главная деталь про HTTPS: начиная с Android 7 приложения по умолчанию не доверяют сертификатам, которые установил пользователь. Чтобы прокси расшифровал трафик, в network_security_config.xml добавляют блок <debug-overrides> с доверием к пользовательским сертификатам, и действует он только в debuggable-сборке. Certificate pinning через CertificatePinner перехват тоже заблокирует, для отладки его отключают флагом сборки.
Где спотыкаются
Ставят сертификат Charles на телефон и не понимают, почему трафик не расшифровывается. Не знают про ограничение Android 7 и network_security_config.
Путают инструменты: предлагают MockWebServer для ручной подмены ответа в запущенном приложении, хотя он нужен для автотестов.
Оставляют отладочный интерцептор или доверие к пользовательским сертификатам в релизной сборке. Это прямая дыра: трафик ваших пользователей сможет прочитать и подменить кто угодно.