Изучение Android Studio за одну статью! Создание программы с API

ОС Андроид – одна из самых популярных ОС в мире. Мы подготовили большой урок по изучению программы Android Studio и построению полноценного Андроид приложения. За урок мы сделаем программу с API.
Информация про Андроид
На ОС Андроид сегодня работают не только мобильные и планшетные устройства, но также всевозможные часы, телевизоры, компьютеры и даже, как бы это не звучало, холодильники.

Несмотря на огромное множество устройств разработка под многие из них происходит через одну общую программу – Android Studio . Конечно же, у каждой платформы будут свои особенности: размер экрана, характеристики устройства и так далее. Тем не менее, общий процесс создания будет примерно схожим.
Таким образом, изучив Андроид Студио вы сможете в будущем спокойно переходить от одной платформы к другой. Напомним, на сегодняшний день только мобильные устройства на ОС Андроид занимают примерно 85% всего рынка смартфонов.
Языки программирования для Андроид
Разрабатывать под Андроид можно за использованием нескольких разных языков программирования. Зачастую все разрабатывают на основе языка Java, но помимо него можно использовать язык Kotlin, Python, React Native, Flutter и даже на HTML и CSS можно делать проекты.
Ниже видео на тему разработки Андроид проекта на HTML и CSS:
Вы можете использовать разные языки, но наиболее часто используется Джава или его более молодой собрат – Kotlin . В любом случае, если вы только приступаете к Андроид, то ни про какой другой язык помимо Джава вам не стоит думать. Если в будущем нужно будет писать на Котлин, то вам все равно знания разработки Андроид проектов на Джава будут нужны.
Установка всего необходимого
Для разработки под Андроид требуется всего две вещи. Во-первых, вам нужно скачать на компьютер Джава JDK. Это можно сделать через официальный сайт Oracle.
Во-вторых, вам потребуется программа Андроид Студио. Именно она является наиболее популярной программой для разработки приложений под Андроид. Скачать бесплатно эту программу можно также с ее официального сайта . После скачивания Джава и Андроид Студио выполните их установку и далее мы сможем приступить к разработке проекта.
Создание функций
Теперь нам нужно создать весь функционал для приложения.
В приложении мы будем получать данные о погоде. Чтобы это делать сперва зарегистрируйтесь и получите API ключ на сайте OpenWeaterMap .
Теперь остается прописать весь код. Код класса «MainActivity» представлен ниже вместе с комментариями.
Дополнительно скачать полностью весь проект можно по этой ссылке .
package com.itproger.weatherapp; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends AppCompatActivity < // Поля, что будут ссылаться на объекты из дизайна private EditText user_field; private Button main_btn; private TextView result_info; @Override protected void onCreate(Bundle savedInstanceState) < // Сработает при создании Activity super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Устанавливаем ссылки на объекты из дизайна user_field = findViewById(R.id.user_field); main_btn = findViewById(R.id.main_btn); result_info = findViewById(R.id.result_info); // Обработчик нажатия на кнопку main_btn.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View view) < // Если ничего не ввели в поле, то выдаем всплывающую подсказку if(user_field.getText().toString().trim().equals("")) Toast.makeText(MainActivity.this, R.string.no_user_input, Toast.LENGTH_LONG).show(); else < // Если ввели, то формируем ссылку для получения погоды String city = user_field.getText().toString(); String key = "ваш ключ здесь"; String url = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + key + "&units=metric&lang=ru"; // Запускаем класс для получения погоды new GetURLData().execute(url); >> >); > @SuppressLint("StaticFieldLeak") private class GetURLData extends AsyncTask < // Будет выполнено до отправки данных по URL protected void onPreExecute() < super.onPreExecute(); result_info.setText("Ожидайте. "); >// Будет выполняться во время подключения по URL @Override protected String doInBackground(String. strings) < HttpURLConnection connection = null; BufferedReader reader = null; try < // Создаем URL подключение, а также HTTP подключение URL url = new URL(strings[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect(); // Создаем объекты для считывания данных из файла InputStream stream = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(stream)); // Генерируемая строка StringBuilder buffer = new StringBuilder(); String line = ""; // Считываем файл и записываем все в строку while((line = reader.readLine()) != null) buffer.append(line).append("\n"); // Возвращаем строку return buffer.toString(); >catch (MalformedURLException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >finally < // Закрываем соединения if(connection != null) connection.disconnect(); try < if (reader != null) reader.close(); >catch (IOException e) < e.printStackTrace(); >> return null; > // Выполняется после завершения получения данных @SuppressLint("SetTextI18n") @Override protected void onPostExecute(String result) < super.onPostExecute(result); // Конвертируем JSON формат и выводим данные в текстовом поле try < JSONObject jsonObject = new JSONObject(result); result_info.setText("Температура: " + jsonObject.getJSONObject("main").getDouble("temp")); >catch (JSONException e) < e.printStackTrace(); >> > >
Видео на эту тему
Также вы можете просмотреть детальное видео по разработке данного приложения:
Дополнительный курс
На нашем сайте также есть углубленный курс по изучению языка Java . В ходе огромной программы вы изучите не только язык Java, но также научитесь создавать веб сайты, программы под ПК, приложения под Андроид и многое другое. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Java и создавать на нём полноценные проекты.
Больше интересных новостей

Самые дорогие IT бренды мира

7 фильмов и сериалов о роботах и киборгах

Email-рассылка: ТОП-7 сервисов

Лучшие сайты, созданные на C# ASP .NET
Комментарии (4)
Роман 20 мая 2023 в 16:56
Приложение вылетает
Аки 05 марта 2023 в 12:31
«Этот файл нельзя открыть, так как он нарушает Условия использования.»
При открытие ссылки проекта вот что показывает
Алекс 31 октября 2022 в 06:35
Падает при кривом вводе названия города )
Нужно с исключениями ещё поработать
Прохор 13 января 2023 в 19:25
А у меня вылетает при введении города, не знаю в чём проблема, вроде делал как на видио.
Роман 06 августа 2022 в 00:10
Retrofit
Многие сайты имеют собственные API для удобного доступа к своим данным. На данный момент самый распространённый вариант — это JSON. Также могут встречаться данные в виде XML и других форматов.
Библиотека Retrofit упрощает взаимодействие с REST API сайта, беря на себя часть рутинной работы.
Авторами библиотеки Retrofit являются разработчики из компании «Square», которые написали множество полезных библиотек, например, Picasso, Okhttp, Otto.
Библиотекой удобно пользоваться для запроса к различным веб-сервисам с командами GET, POST, PUT, DELETE. Может работать в асинхронном режиме, что избавляет от лишнего кода.
В основном вам придётся работать с методами GET и POST. Если вы будет создавать собственный API, то будете использовать и другие команды.
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
В Retrofit 2.x автоматически подключается библиотека OkHttp и её не нужно прописывать отдельно.
Библиотека может работать с GSON и XML, используя специальные конвертеры, которые следует указать отдельно.
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
Затем в коде конвертер добавляется с помощью метода addConverterFactory().
addConverterFactory(GsonConverterFactory.create()
Список готовых конвертеров:
- Gson: com.squareup.retrofit2:converter-gson
- Jackson: com.squareup.retrofit2:converter-jackson
- Moshi: com.squareup.retrofit2:converter-moshi
- Protobuf: com.squareup.retrofit2:converter-protobuf
- Wire: com.squareup.retrofit2:converter-wire
- Simple XML: com.squareup.retrofit2:converter-simplexml
- Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
Retrofit retrofit = Retrofit.Builder() .baseUrl("https://your.api.url/v2/"); .addConverterFactory(ProtoConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build();
Если вы хотите изменить формат какого-нибудь JSON-объекта, то это можно сделать с помощью GsonConverterFactory.create():
Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .create(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/base/") .addConverterFactory(GsonConverterFactory.create(gson)) .build(); service = retrofit.create(APIService.class);
Базовый URL всегда заканчивается слешем /. Задаётся в методе baseUrl(). Можно указать полный URL в запросе, тогда базовый URL будет проигнорирован:
public interface APIService < @GET("https://api.sample.com/users/user/list") CallgetUsers(); >
- POJO (Plain Old Java Object) или Model Class — json-ответ от сервера нужно реализовать как модель
- Retrofit — класс для обработки результатов. Ему нужно указать базовый адрес в методе baseUrl()
- Interface — интерфейс для управления адресом, используя команды GET, POST и т.д.
Работу с Retrofit можно разбить на отдельные задачи.
Задача первая. POJO
Задача первая — посмотреть на структуру ответа сайта в виде JSON (или других форматов) и создать на его основе Java-класс в виде POJO.
POJO удобнее создавать с помощью готовых веб-сервисов в автоматическом режиме. Либо можете самостоятельно создать класс, если структура не слишком сложная.
В классе часто используются аннотации. Иногда они необходимы, иногда их можно пропустить. В некоторых случаях аннотации помогают избежать ошибок. Список аннотаций зависит от типа используемого конвертера, их список можно посмотреть в соответствующей документации.
Задача вторая. Интерфейс
Задача вторая — создать интерфейс и указать имя метода. Добавить необходимые параметры, если они требуются.
В интерфейсе задаются команды-запросы для сервера. Команда комбинируется с базовым адресом сайта (baseUrl()) и получается полный путь к странице. Код может быть простым и сложным. Можно посмотреть примеры в документации.
Запросы размещаются в обобщённом классе Call с указанием желаемого типа.
import retrofit2.Call; public interface APIService < @POST("list") CallloadRepo(); >
В большинстве случаев вы будете возвращать объект Call с нужным типом, например, Call . Если вас не интересует тип ответа, то можете указать Call .
Здесь также используются аннотации, но уже от самой библиотеки.
С помощью аннотации указываются веб-команды, а затем Java-метод. Для динамических параметров используются фигурные скобки (users//repos), в которые подставляются нужные значения.
В самой аннотации используется метод, используемый на сервере, а ниже вы можете указать свой вариант (полезно для соответствия стилю вашего кода.
@GET("get_all_cats") // команда на сервере List getAllCats(); // ваш код
Аннотации
| Аннотация | Описание |
|---|---|
| @GET() | GET-запрос для базового адреса. Также можно указать параметры в скобках |
| @POST() | POST-запрос для базового адреса. Также можно указать параметры в скобках |
| @Path | Переменная для замещения конечной точки, например, username подставится в в адресе конечной точки |
| @Query | Задаёт имя ключа запроса со значением параметра |
| @Body | Используется в POST-вызовах (из Java-объекта в JSON-строку) |
| @Header | Задаёт заголовок со значением параметра |
| @Headers | Задаёт все заголовки вместе |
| @Multipart | Используется при загрузке файлов или изображений |
| @FormUrlEncoded | Используется при использовании пары «имя/значение» в POST-запросах |
| @FieldMap | Используется при использовании пары «имя/значение» в POST-запросах |
| @Url | Для поддержки динамических адресов |
@Query
Аннотация @Query полезна при запросах с параметрами. Допустим, у сайте есть дополнительный параметр к запросу, который выводит список элементов в отсортированном виде: http://example.com/api/v1/products/cats?sort=desc. Это несложный пример и мы можем поместить запрос с параметром в интерфейс без изменений.
@GET("products/cats?category=5&sort=desc") Call getAllCats();
Если не требуется управлять сортировкой, то её можно оставить в коде и она будет применяться по умолчанию. Но в нашем запросе есть ещё один параметр, который отвечает за категорию котов (домашние, уличные, породистые), которая может меняться в зависимости от логики приложения. Этот параметр можно снабдить аннотацией и программно управлять в коде.
@GET("products/cats?sort=desc") Call getAllCats(@Query("category") int categoryId);
Сортировку мы оставляем как есть, а категорию перенесли в параметры метода под именем categoryId, снабдив аннотацией, с которой параметр будет обращаться на сервер в составе запроса.
Call getAllCats() = catAPIService.getAllCats(5);
Запрос получится в виде http://example.com/api/v1/products/cats?sort=desc&category=5.
В одном методе можно указать несколько Query-параметров.
@Path
Запрос может иметь изменяемые части пути. Посмотрите на один из примеров запроса для GitHub: /users/:username. Вместо :username следует подставлять конкретные имена пользователей (https://api.github.com/users/alexanderklimov). В таких случаях используют фигурные скобки в запросе, в самоме методе через аннотацию @Path указывается имя, которое будет подставляться в путь.
@GET("/users/") Call getUser( @Path("username") String userName );
@Headers
Пример аннотации @Headers, которая позволяет указать все заголовки вместе.
@Headers() @GET("some/endpoint")
@Multipart
Пример аннотации @Multipart при загрузке файлов или картинок:
@Multipart @POST("some/endpoint") Call uploadImage(@Part("description") String description, @Part("image") RequestBody image)
@FormUrlEncoded
Пример использования аннотации @FormUrlEncoded:
@FormUrlEncoded @POST("/some/endpoint") Call someEndpoint(@FieldMap Map names);
@Url
Пример аннотации @Url:
public interface UserService < @GET public CallgetZipFile(@Url String url); >
Задача третья. Retrofit
Для синхронного запроса используйте метод Call.execute(), для асинхронного — метод Call.enqueue().
Объект для запроса к серверу создаётся в простейшем случае следующим образом
public static final String BASE_URL = "http://api.example.com/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build();
В итоге мы получили объект Retrofit, содержащий базовый URL и способность преобразовывать JSON-данные с помощью указанного конвертера Gson.
Далее в его методе create() указываем наш класс интерфейса с запросами к сайту.
UserService userService = retrofit.create(UserService.class);
После этого мы получаем объект Call и вызываем метод enqueue() (для асинхронного вызова) и создаём для него Callback. Запрос будет выполнен в отдельном потоке, а результат придет в Callback в main-потоке.
В результате библиотека Retrofit сделает запрос, получит ответ и производёт разбор ответа, раскладывая по полочкам данные. Вам остаётся только вызывать нужные методы класса-модели для извлечения данных.
Основная часть работы происходит в onResponse(), ошибки выводятся в onFailure() (неправильный адрес сервера, некорректные формат данных, неправильный формат класса-модели и т.п). HTTP-коды сервера (например, 404) не относятся к ошибкам.
Метод onResponse() вызывается всегда, даже если запрос был неуспешным. Класс Response имеет удобный метод isSuccessful() для успешной обработки запроса (коды 200хх). В ошибочных ситуациях вы можете обработать ошибку в методе errorBody() класса ResponseBody.
Другие полезные методы Response.
- code() — HTTP-код ответа
- body() — сам ответ в виде строки, без сериализации
- headers() — HTTP-заголовки
- message() — HTTP-статус (или null)
- raw() — сырой HTTP-ответ
Можно написать такую конструкцию.
// код 200 if (response.isSuccessful()) < . // код для успешного случая >else < switch(response.code()) < case 404: // страница не найдена. можно использовать ResponseBody, см. ниже break; case 500: // ошибка на сервере. можно использовать ResponseBody, см. ниже break; >// или // Также можете использовать ResponseBody для получения текста ошибки ResponseBody errorBody = response.errorBody(); try < mTextView.setText(errorBody.string()); >catch (IOException e) < e.printStackTrace(); >>
Для отмены запроса используется метод Call.cancel().
Перехватчики (Interceptors)
В библиотеку можно внедрить перехватчики для изменения заголовков при помощи класса Interceptor из OkHttp. Сначала следует создать объект перехватчика и передать его в OkHttp, который в свою очередь следует явно подключить в Retrofit.Builder через метод client().
Поддержка перехватчиков/interceptors для обработки заголовков запросов, например, для работы с токенами авторизации в заголовке Authorization.
OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() < @Override public Response intercept(Chain chain) throws IOException < Request original = chain.request(); // Настраиваем запросы Request request = original.newBuilder() .header("Accept", "application/json") .header("Authorization", "auth-token") .method(original.method(), original.body()) .build(); Response response = chain.proceed(request); return response; >>); Retrofit retrofit = Retrofit.Builder() .baseUrl("https://your.api.url/v2/"); .client(client) .build();
HttpLoggingInterceptor
Библиотека HttpLoggingInterceptor является частью OkHttp, но поставляется отдельно от неё. Перехватчик следует использовать в том случае, когда вам действительно нужно изучать логи ответов сервера. По сути библиотека является сетевым аналогом привычного LogCat.
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
Подключаем перехватчик к веб-клиенту. Добавляйте его после других перехватчиков, чтобы ловить все сообщения. Существует несколько уровней перехвата данных: NONE, BASIC, HEADERS, BODY. Последний вариант самый информативный, пользуйтесь им осторожно. При больших потоках данных информация забьёт весь экран. Используйте промежуточные варианты.
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); // Только в режиме отладки if(BuildConfig.DEBUG) < loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY ); >OkHttpClient okClient = new OkHttpClient.Builder() .addInterceptor(new ResponseInterceptor()) .addInterceptor(loggingInterceptor) .build();
RxJava
Сами разработчики библиотеки очень любят реактивное программирование и приложили многие усилия для интеграции с библиотекой RxJava.
// build.gradle implementation 'com.squareup.retrofit2:adapter-rxjava:2.5.0' Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl); .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build();
Как сделать запрос к внешнему API из андроид приложения Kotlin
Пытаюсь написать приложение на андроид для своего сайта. На сайте написал API теперь хочу в приложении получать даныне с этого API. Много гуглил по итогу в голове каша. Все примеры что находил или не работают или плохо рассказывают. Помогите написать запрос к API без всяких приамбул. В чистом виде
Отслеживать
48.6k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 2 фев 2021 в 4:48
17 2 2 бронзовых знака
Ваш вопрос не совсем понятен, что вы имеете ввиду «в чистом виде»? При разработке приложений под Андроид часто пользуются сторонними библиотеками. Вы уже выбрали, какую библиотеку вы хотите использовать? Вполне можно обойтись без библиотек, но кода выйдет больше. Ваш вопрос задан слишком обобщенно, уточните хотя бы в вопросе о том, есть ли у вас какие-то предпочтения или ограничения по поводу использования сторонних библиотек.
Проект API с точки зрения разработчика Android
По словам знакомых бэкенд-разработчиков, проще всего в моем случае начать писать серверное приложение на NodeJS с использованием TypeScript.
Любопытно то, что платформа NodeJS, предназначенная только для работы с JavaScript, не выполняет код TypeScript. В связи с этим требуется преобразовать код TypeScript в JavaScript. Такой процесс называется транспиляцией.
Что касается IDE, я поэкспериментировал с 2 инструментами: Visual Studio Code и WebStorm. В итоге отдал предпочтение второму варианту. Как оказалось, мне намного проще работать с WebStorm, поскольку я привык к Android Studio. Оба эти инструмента входят в число продуктов JetBrains, поэтому обладают схожими принципами разработки.
Структура проекта
Существует множество способов организации файлов в серверном приложении. Рассмотрим один из них, более соответствующий проекту Android:
Прокомментируем эту схему, проводя терминологические параллели с разработкой Android.
- package.json — это своего рода синтез build.gradle и AndroidManifest.xml , если посмотреть на проект с точки зрения разработчика Android. В этом файле мы определяем: имя и версию приложения; главный файл, в котором оно запускается; скрипты, например задачи Gradle ; зависимости; зависимости разработки и другое.
- __test__ — каталог для размещения модульных тестов. На стороне сервера в качестве фреймворка используется Jest, аналог JUnit в разработке Android.
- jest.config.js — файл, в котором мы определяем конфигурацию тестов и способ их выполнения.
- src — каталог для группировки кода, что-то наподобие главного модуля приложения main .
Архитектура
Точки входа
На стороне сервера в качестве точек входа используются не Activity и Fragments , а маршруты (англ. routes). У нас нет UI, которого может коснуться пользователь. Приложения, которые в данном случае являются пользователями, вызывают разные маршруты: GET , POST , PUT и другие. Рассмотрим пример маршрута.
Пример 1. Базовая конфигурация для применения Express с пользовательским объектом Router .
import express, < Request, Response, NextFunction >from "express";
require('express-async-errors');
import < historyRoutes >from "./routes/history.routes";
const app = express();
app.use(express.json());
app.use("/history", historyRoutes);
Express — это фреймворк, упрощающий процесс создания маршрутов. Как видно, файл app.ts импортирует historyRoutes , уже определенный файлом historic.routes.ts . Рассмотрим пример метода POST , делегированного определенному контроллеру, который перенаправляет запрос в конкретный UseCase .
Пример 2. Объект Controller обрабатывает запрос POST .
import < Router >from "express";
import < CreateNewHistoricEntryController >from "../../controllers/CreateNewHistoricEntryController";
const historyRoutes = Router();
const createNewHistoricEntryController = new CreateNewHistoricEntryController();
historyRoutes.post("/historic", createNewHistoricEntryController.handle);
export < historyRoutes >;
Внедрение зависимостей
Если вы с удовольствием работаете с Koin и Kodein в мире Android, то с легкостью освоите TSyringe в качестве библиотеки для внедрения зависимостей.
Следующий код отображает файл server.ts , в котором мы регистрируем ссылку на Singleton для FirestoreDataSource , реализующего интерфейс ISisOrgRepository . Этот файл подобен классу Application и является точкой входа приложения.
Пример 3. Добавление экземпляра репозитория Application , который будет доступен для всего приложения.
import < container >from "tsyringe";
.
function setup() container.registerSingleton(
"ISisOrgRepository",
FirestoreDataSource
);
>
.
app.listen(port, () => setup();
console.log("Server is running. ");
>);
Библиотека TSyringe знает, что если кому-то потребуется ссылка на ISisOrgRepository , она обязана предоставить экземпляр FirestoreDataSource . В этом случае класс CreateNewHistoricEntryController должен создать CreateNewHistoricEntryUseCase . Но для этого необходимо попросить TSyringe разрешить зависимости (аргумент конструктора ISisOrgRepository ).
Пример 4. UseCase с аннотациями, помогающими библиотеке для внедрения зависимостей.
@injectable()
class CreateNewHistoricEntryUseCase constructor(
@inject("ISisOrgRepository")
private sisOrgRepository: ISisOrgRepository
) >
async execute(request: IRequest): Promise const historicEntries: IHistoricEntry[] = [];
.
await this.sisOrgRepository.createHistoricEntry(historicEntries);
return historicEntries;
>
>
export < CreateNewHistoricEntryUseCase >;
Внутри CreateNewHistoricEntryController мы можем попросить библиотеку для внедрения зависимостей о содействии в создании объекта CreateNewHistoricEntryUseCase .
Пример 5. Контроллер запрашивает ссылку на контейнер UseCase .
import < Request, Response >from "express";
import < container >from "tsyringe";
import < CreateNewHistoricEntryUseCase >from "../domain/useCases/CreateNewHistoricEntryUseCase";
class CreateNewHistoricEntryController async handle(request: Request, response: Response): Promise const < beds, activity, crop, variety, resultIndicator, input >= request.body;
const useCase = container.resolve(CreateNewHistoricEntryUseCase);
const result = await useCase.execute( beds, activity, crop, variety, resultIndicator: resultIndicator, input
>);
return response.status(201).json(result);
>
>
export < CreateNewHistoricEntryController >;
Тесты
Я опробовал две очень похожие библиотеки: Jasmine и Jest. В итоге выбрал Jest, поскольку она предоставляет отличный формат вывода результатов.
Пример 6. Отчет о результатах выполнения от Jest.
Синтаксис сильно отличается от тестов JUnit, использующих Kotlin. Однако все проясняется, если понимать describe как имя набора тестов, а it — как имя модульного теста. Часть, касающаяся утверждений, не представляет сложности и напоминает принцип работы с библиотекой Truth.
Пример 7. Тест с применением Jest в TypeScript — класс TimeHelper .
mport < TimeHelper >from "util/TimeHelper"
describe("Time Helper", () => it("should get total minutes from 3h", () => const totalMinutes = TimeHelper.getTotalMinutes("3h")
expect(totalMinutes).toBe(180)
>)
it("should get total minutes from 3h 15min", () => const totalMinutes = TimeHelper.getTotalMinutes("3h 15min")
expect(totalMinutes).toBe(195)
>)
>)
Дополнительные рекомендации
- Heroku — отличная платформа для размещения API. Она предоставляет удобный CLI. Если package.json в порядке, то при каждой отправке кода CLI автоматически выполняет скрипты (транспиляцию, установку зависимостей, запуск сервера).
- Insomnia — превосходный инструмент для тестирования маршрутов. С его помощью можно создавать различные среды (разработки, продакшн и т.д.)
- Swagger позволяет создавать содержательную документацию, в которой можно запускать маршруты (пример по ссылке).
Заключение
Если вы начинаете задействовать новые технологии, советую обращаться к опыту специалистов и обсуждать с ними технические вопросы. Их оперативные рекомендации помогут сэкономить время и быстрее научиться всему необходимому.
- Kotlin Coroutines для Android — Прощай RxJava?
- Как работают обобщения в Kotlin
- Автоматизация создания файлов для нового экрана с плагином для Android Studio
Читайте нас в Telegram, VK и Дзен