Веб-API — это интерактивный «интерфейс прикладного программирования», который позволяет разработчикам взаимодействовать с внешними службами. Это команды, которые, по мнению разработчика службы, будут использоваться для доступа к определенным функциям их программы. Он называется интерфейсом, потому что в хорошем API должны быть команды, делающие его интуитивно понятным для взаимодействия.
Примером этого может быть случай, когда мы хотим получить информацию о пользователе из его учетной записи в социальной сет. Эта платформа социальных сетей, скорее всего, будет иметь веб-API, который разработчики будут использовать для запроса этих данных. Другие часто используемые API обрабатывают такие вещи, как реклама (AdMob), машинное обучение ( ML Kit ) и облачное хранилище.
Легко увидеть, как взаимодействие с этими типами служб может расширить функциональность приложения. Фактически, подавляющее большинство успешных приложений в Play Store используют хотя бы один веб-API!
В этом посте мы рассмотрим, как использовать веб-API из приложения для Android.
Как работает веб-API
Большинство API работают с использованием XML или JSON. Эти языки позволяют нам отправлять и получать большие объемы полезной информации в виде объектов.
XML — это расширяемый язык разметки. Если вы разработчик Android, то вы, вероятно, уже знакомы с XML по созданию макетов и сохранению переменных.
XML прост для понимания и обычно помещает ключи в треугольные скобки, за которыми следуют их значения. Он немного похож на HTML:
<client>
<name>Александр</name>
<age>41</age>
</client>
JSON означает «Нотация объектов Javascript». Это сокращение для отправки данных в Интернете. Подобно XML или CSV-файлу, его можно использовать для отправки «пар значение/атрибут».
Однако здесь синтаксис выглядит немного иначе:
[{client: {“name”:”Александр”, “age”: 41}}]
Это «объекты данных» в том смысле, что они являются концептуальными сущностями (в данном случае людьми), которые могут быть описаны парами ключ/значение. Мы используем их в наших приложениях для Android, превращая их в объекты, как обычно, с использованием классов.
Смотрите также: Python или Java: какой язык лучше изучать и в чем различия?
Чтобы увидеть это в действии, нам нужно найти веб-API, который мы сможем легко использовать. В этом примере мы будем использовать заполнитель JSON. Это бесплатный REST API специально для тестирования и создания прототипов, который идеально подходит для изучения нового навыка! REST — это особый архитектурный «стиль», ставший стандартом для связи по сетям. REST-совместимые системы называются «RESTful» и обладают определенными характеристиками. Однако вам не нужно сейчас об этом беспокоиться.
Настройка нашего проекта для Retrofit 2
В этом примере мы также будем использовать REST-клиент под названием Retrofit 2. Это очень полезный HTTP-клиент для Android, который позволяет приложениям безопасно подключаться к веб-API с существенно меньшим количеством кода. Затем его можно использовать, например, для отображения твитов из Twitter или для проверки погоды. Он значительно сокращает объем работы, которую разработчику нужно сделать, чтобы все работало.
Это полезно знать: Как отменить подписку в Google Play
Во-первых, нам нужно добавить разрешение для доступа в Интернет в наш файл манифеста Android, чтобы убедиться, что нашему приложению разрешено выходить в Интернет. Вот что вам нужно включить:
<uses-permission android:name="aandroid.permission.INTERNET" />
Нам также необходимо добавить зависимость, если мы собираемся заставить Retrofit 2 работать в нашем приложении. Итак, в вашем файле build.gradle на уровне модуля добавьте:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
Нам также понадобится что-то под названием Gson:
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
Gson — будет преобразовывать данные JSON в объект Java для нас (процесс, называемый десериализацией). Мы могли бы сделать это вручную, но использование подобных инструментов значительно упрощает жизнь!
На самом деле существуют более поздние версии Retrofit, в которые внесены некоторые изменения. Если вы хотите быть в курсе событий, загляните на официальный сайт.
Преобразование JSON в объект Java
«Route» — это URL-адрес, представляющий конечную точку для API. Если мы посмотрим на заполнитель JSON, вы увидите, что у нас есть такие параметры, как «/posts» и «/comments?postId=1». Скорее всего, вы сами видели такие URL-адреса при просмотре веб-страниц!
Щелкните на /posts, и вы увидите большой объем данных в формате JSON. Это фиктивный текст, который имитирует внешний вид страницы, полной сообщений в социальных сетях. Это информация, которую мы хотим получить из нашего приложения и затем отобразить на экране.
[{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
Для обработки этой информации нам понадобится класс, который может создавать объекты из десериализованных данных. Для этого создайте в своем проекте новый класс и назовите его «PlaceholderPost». Для этого потребуются переменные, соответствующие данным, которые мы получаем со страницы /posts («body», «ID» и т.д.). Мы будем получать эту информацию из веб-API, поэтому нам нужен геттер для каждого из них.
Итоговый класс должен выглядеть так:
public class PlaceholderPost {
private int userID;
private int id;
private String title;
private String body;
public int getUserId() {
return userID;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getBody() {
return body;
}
}
С таким же успехом это могут быть пользователи Twitter, сообщения в Facebook или информация о погоде!
Файлы интерфейса
Далее нам понадобится новый интерфейсный файл. Вы создаете его так же, как и класс: щелкая имя вашего пакета в окне проекта и выбирая «New>Class», но здесь вы выбираете «Interface» под тем местом, где вы вводите имя. Файл интерфейса содержит методы, которые позже реализуются классом. Я назвал свой «PlaceholderAPI».
Этому интерфейсу нужен только один метод для извлечения всех данных из «/Post». Если вы еще раз взглянете на этот JSON, вы заметите, что фигурные скобки находятся внутри квадратных скобок. Это означает, что у нас есть массив объектов, поэтому мы хотим создать для них список. Объекты — это экземпляры нашего «PlaceholderPost», которые мы только что создали, вот что мы и помещаем сюда!
Для тех, кто новичок в программировании, помните, что любые красные линии, означают, что вы не импортировали класс. Просто щелкните выделенный оператор и нажмите alt+return, чтобы сделать это автоматически.
(Я не могу представить, чтобы кто-то использовал это урок как первый в программирования, но как знать!)
Это выглядит так:
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface PlaceholderAPI {
@GET("posts")
Call<List> getPosts();
}
Показ содержимого
Теперь вернитесь к своему основному занятию. Мы могли бы создать причудливый макет для отображения всех этих данных, но, чтобы все было красиво и просто, я просто буду придерживаться макета как есть.
Чтобы использовать Retrofit, нам нужно создать новый класс Retrofit Factory, который даст вам один и тот же объект Retrofit всякий раз, когда вы его попросите. В результате должно получиться вот так:
package ru.xpcom.retrofit2;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitFactory {
private static Retrofit retrofit = null;
private RetrofitFactory () {} // class should not be initialized
public static Retrofit getRetrofit(String baseUrl) {
if(retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
Как видите, здесь мы передаем остальную часть URL-адреса. Затем мы будем использовать наш интерфейс:
Call<List> call = placeholderAPI.getPosts();
Теперь нам просто нужно вызвать метод в классе MainActivity! Поскольку до сих пор все было слишком просто, Android не дает вам сделать это в основном потоке. Причина, конечно же, в том, что если процесс займет слишком много времени, приложение зависнет! Это актуально при использовании любого веб-API. В этом есть смысл, но это не очень удобно, когда мы просто хотим создать учебник. К счастью, нам не нужно создавать второй поток самостоятельно, поскольку Retrofit фактически делает все это за нас.
Теперь мы получим обратные вызовы onResponse и onFailure. onFailure — это то место, где нужно обрабатывать любые ошибки.
Однако onResponse не означает, что все прошло гладко. Это просто означает, что был ответ; что сайт существует. Если мы получим сообщение 404, это все равно будет считаться «ответом». Таким образом, нам нужно еще раз проверить, прошел ли процесс гладко, с помощью isSuccessful() , который проверяет, не является ли код HTTP ошибкой.
Для простоты я собираюсь отобразить только один фрагмент данных одного из объектов, которые мы получили. Для этого я переименовал textView в файле макета, присвоив ему идентификатор «текст». Вы можете поэкспериментировать с этим сами.
Полный код выглядит так:
package ru.xpcom.retrofit2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
public final String URL_API = "https://jsonplaceholder.typicode.com/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getDataFromApi ();
}
private void getDataFromApi () {
Retrofit retrofit = RetrofitFactory.getRetrofit(URL_API);
PlaceholderAPI placeholderAPI = retrofit.create(PlaceholderAPI.class);
Call<List> call = placeholderAPI.getPosts();
call.enqueue(new Callback<List>() {
@Override
public void onResponse(Call<List> call, Response<List> response) {
if (response.isSuccessful()) {
List posts = response.body();
Log.d("Success", posts.get(3).getBody().toString());
TextView textView = findViewById(R.id.text);
textView.setText(posts.get(3).getBody().toString());
} else {
Log.d("Ей", "Вау!");
return;
}
}
@Override
public void onFailure(Call<List> call, Throwable t) {
Log.d("Ей", "Ошибка!!");
}
});
Log.d("Эй","Привет!");
}
}
Подведем итог
На этом этапе у вас должно быть хорошее представление о том, как работает веб-API и почему он вам нужен. Вы бы также создали свое первое приложение, которое использует веб-API для выполнения чего-то потенциально полезного.
Конечно, существует бесчисленное множество других веб-API, и каждый работает по-своему. Некоторым потребуются дополнительные SDK или другие библиотеки. Точно так же есть много других действий помимо запроса «GET», который мы продемонстрировали здесь. Например, вы можете использовать «POST» для отправки данных на сервер, что полезно, если вы хотите, чтобы ваши пользователи могли публиковать сообщения в социальных сетях из ваших приложений.
Возможности безграничны, если объединить мощь и гибкость Android с огромными ресурсами, доступными в Интернете.