Обзор сетевых инструментов Android: получение, отправка, проверка, фиктивные серверы

Обзор сетевых инструментов Android: получение, отправка, проверка, фиктивные серверы

2 июня 2022 г.

Сегодня все приложения так или иначе связаны с Интернетом. При разработке простых приложений, как правило, проблем не возникает. Другое дело, когда приложения сложные, с множеством запросов к сети. В этом случае различные инструменты и библиотеки могут помочь вам в работе с сетью и поиске проблем. Мы изучим их в этой статье. Надеюсь, вы найдете для себя что-то новое, хотя некоторые вещи могут показаться вам знакомыми.


Замечания и предположения


Прежде всего, хочу обратить ваше внимание на некоторые замечания и предположения:


  • В этой статье мы рассмотрим конкретные примеры, код которых можно вставить в Android Studio, запустить и посмотреть, что получится;

  • В данной статье речь пойдет о работе с Интернетом по протоколу http/https. Мы не будем рассматривать WebSocket и потоковые протоколы;

  • Также мы не будем рассматривать библиотеки для конкретных типов данных, например, для загрузки картинок типа glide и picasso;

  • Мы будем идти от простых вещей, постепенно их усложняя;

  • Код не будет разбит на слои по шаблонам MVP и MVVM и т.д. Это сделано для упрощения примеров и статьи в целом;

  • Не забудьте указать разрешение в манифесте ;

  • Эта статья предназначена для разработчиков среднего уровня и выше, поэтому мы не будем останавливаться на очень простых вещах; по той же причине мы не будем вдаваться в каждый отдельный пример или библиотеку. Дается только обзор инструментов для расширения кругозора;

Способы получения и отправки данных на Android


Выбор примера


Для примера будем использовать аккаунт Google на Github, так как API открытый и не требует дополнительных запрос токена и другие учетные данные. Перейдем на страницу. Вот как это выглядит:



Обратите внимание на описание с сердечком: «Google ❤️ с открытым исходным кодом». Теперь обратимся к API этой страницы. Для этого вам нужно перейти сюда. Это выглядит так:



Обратите внимание на сердечко в описании: оно есть, все в норме, данные соответствуют. Мы решили работать с открытым API. Теперь воспользуемся им для тестирования инструментов, о которых пойдет речь ниже.


HttpUrlConnection


Давайте получим эту строку на устройстве Android. Во-первых, давайте возьмем встроенный инструмент HttpUrlConnection и попробуем его использовать. Нам не нужно добавлять какие-либо библиотеки.


Создайте действие и поместите в него следующий код:


```javascript


класс HttpUrlConnectionActivity: AppCompatActivity() {


переопределить удовольствие onCreate(savedInstanceState: Bundle?) {


super.onCreate(сохраненныйInstanceState)


Тема {запрос()}.start()


запрос частного развлечения () {


val url = URL("https://api.github.com/orgs/google")


val соединение = url.openConnection() как HttpURLConnection


val response = connection.inputStream.bufferedReader().use(BufferedReader::readText)


Log.d("HttpExample", "ответ: $response")


Запускаем приложение и попадаем в LogCat:


```json


D: ответ: {"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","url":"https://api.github.com/orgs/google","repos_url ":"https://api.github.com/orgs/google/repos","events_url":"https://api.github.com/orgs/google/events","hooks_url":"https:/ /api.github.com/orgs/google/hooks","issues_url":"https://api.github.com/orgs/google/issues","members_url":"https://api.github.com /orgs/google/members{/member}","public_members_url":"https://api.github.com/orgs/google/public_members{/member}","avatar_url":"https://avatars.githubusercontent .com/u/1342004?v=4","description":"Google ❤️ Open Source","name":"Google","company":null,"blog":"https://opensource.google/ ","location":null,"email":"opensource@google.com","twitter_username":"GoogleOSS","is_verified":true,"has_organization_projects":true,"has_repository_projects":true,"public_repos": 2237,"public_gists":0,"followers":0,"following":0,"html_url":"https://github.com/google","created_at":"2012-01-18T01:30:18Z ","updated_at":"2021-1 2-30T01:40:20Z","тип":"Организация"}


В логе получили ту же строку, что и в браузере. Обратите внимание на строку с ❤️. Как видите, для получения ответа потребовалось всего 5–10 строк кода. Этот пример не обрабатывает ошибки и ответы от сервера. Ставим на то, что все работает нормально.


Плюсы и минусы


  • Этот родной инструмент всегда доступен для использования.

  • Не нужно тянуть дополнительные библиотеки

  • Android присутствует с первого дня, поэтому все максимально протестировано и все ошибки исправлены

  • Сложно использовать для перехвата исключений

  • Сложно использовать для построения сложных запросов и передачи заголовков. Здесь мы фактически работаем со строками

Этот инструмент лежит под капотом некоторых библиотек, в том числе и кроссплатформенных, поэтому, чтобы понять суть их работы, нужно его знать. Теперь давайте перейдем к библиотекам, которые, по сути, делают то же самое, что и встроенный инструмент HttpUrlConnection , но значительно облегчают жизнь разработчику.


Охтп


Начнем с библиотеки Okhttp компании Square.


Добавим импорт:


```javascript


реализация ‘com.squareup.okhttp3:okhttp:4.0.1’


Создайте действие и вставьте следующий код:


```javascript


класс OkhttpActivity: AppCompatActivity() {


переопределить удовольствие onCreate(savedInstanceState: Bundle?) {


super.onCreate(сохраненныйInstanceState)


Тема {запрос()}.start()


val запрос = Request.Builder().url("https://api.github.com/orgs/google").build()


val ответ = OkHttpClient().newCall(запрос).execute().body?.string()


Log.d("HttpExample", "ответ: $response")


Мы получаем тот же ответ с ❤️, что и в последней версии с HttpUrlConnection:


```json


D: ответ: {"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","url":"https://api.github.com/orgs/google","repos_url ":"https://api.github.com/orgs/google/repos","events_url":"https://api.github.com/orgs/google/events","hooks_url":"https:/ /api.github.com/orgs/google/hooks","issues_url":"https://api.github.com/orgs/google/issues","members_url":"https://api.github.com /orgs/google/members{/member}","public_members_url":"https://api.github.com/orgs/google/public_members{/member}","avatar_url":"https://avatars.githubusercontent .com/u/1342004?v=4","description":"Google ❤️ Open Source","name":"Google","company":null,"blog":"https://opensource.google/ ","location":null,"email":"opensource@google.com","twitter_username":"GoogleOSS","is_verified":true,"has_organization_projects":true,"has_repository_projects":true,"public_repos": 2237,"public_gists":0,"followers":0,"following":0,"html_url":"https://github.com/google","created_at":"2012-01-18T01:30:18Z ","updated_at":"2021-1 2-30T01:40:20Z","тип":"Организация"}


Как видите, ответ снова был дан в нескольких строчках. Визуально он мало чем отличается от прошлой версии. Но это в таком простом случае. Различия будут заметны в более сложном случае. Эта библиотека упростила способ передачи заголовков. Вы можете прочитать больше [здесь] (https://medium.com/r/?url=https%3A%2F%2Fgithub.com%2Fsquare%2Fokhttp).


Плюсы и минусы


  • Упрощен способ передачи заголовков и тела

  • Дополнительная библиотека немного увеличивает размер приложения

Полезные ссылки


https://github.com/square/okhttp


Модернизация


Давайте взглянем на Retrofit, тоже от Square. Эта библиотека делает то же самое, что и Okhttp. Но есть значительные оптимизации, когда вам нужно делать сложные URL-запросы.


Добавляем зависимости:


```javascript


реализация 'com.squareup.retrofit2:retrofit:2.5.0'


реализация 'com.squareup.retrofit2: конвертер-скаляры: 2.1.0'


реализация 'com.squareup.retrofit2: адаптер-rxjava2: 2.5.0'


реализация 'io.reactivex.rxjava2:rxjava:2.2.8'


реализация 'io.reactivex.rxjava2:rxandroid:2.1.1'


Обратите внимание, что в дополнение к библиотеке Retrofit добавлена ​​RxJava и ее адаптеры. Это связано с тем, что Retrofit дает не строку, а объект RxJava, например Single. Это упрощает работу с многопоточностью. Модернизация также может дать LiveData и Flow.


Создание Activity со следующим кодом:


```javascript


класс RetrofitActivity: AppCompatActivity() {


переопределить удовольствие onCreate(savedInstanceState: Bundle?) {


super.onCreate(сохраненныйInstanceState)


setContentView (R.layout.activity_retrofit)


findViewById

PREVIOUS ARTICLE
NEXT ARTICLE