Я много раз пытался спроектировать API для своих приложений, и это всякий раз заканчивалось разочарованием по одной из этих причин:

  • Недостаточное понимание языка или фреймворка.
  • Неготовность платить за хостинг до запуска проекта.
  • Платформа без поддержки масштабирования.

Так что, столкнувшись со всеми этими проблемами, я решил написать REST API на Kotlin, используя фреймворк Spring Boot, а также Gradle в качестве поставщика зависимостей (вместо Maven). Как Android-разработчик, я уже знаком с Kotlin и Gradle. Spring Boot же, с другой стороны, предоставляет способ быстрой настройки API, а также содержит встроенный Tomcat. Еще одна сильная сторона Spring Boot  —  активное сообщество пользователей, которое уже имеет опыт в решении проблем масштабирования.

1. Создаем проект Spring Boot через генератор проектов Spring Boot со следующими параметрами.

На картинке видны параметры, которые использовал я. Пока что не нужно добавлять никаких зависимостей — этим займемся позже. Нажимаем на “Сгенерировать” (Generate) и получаем zip-файл с пустым проектом.

2. Открываем сгенерированный проект в IntelliJ Idea

На всякий случай: вот содержимое моего файла build.gradle.kts  —  просто чтобы убедиться, что все мы видим одно и то же. Благодаря знакомству с Gradle, мы можем распознать здесь такие элементы, как плагин Kotlin и зависимости, а также Java 1.8, благодаря которому в нашем проекте доступны функции языка Java 8.

3. Создаем первый контроллер

Контроллер  —  то, что обрабатывает запрос от клиента и возвращает ответ с требуемой информацией. Здесь вы найдете больше подробностей о контроллерах Spring.

Начнем с того, что добавим зависимости для всех веб-ресурсов Spring Boot (включая контроллеры) в наш build.gradle.kts:

implementation("org.springframework.boot:spring-boot-starter-web" )

После синхронизации Gradle перейдем к нашему классу HelloController. В демонстрационных целях я включил сюда несколько примеров того, как добавлять параметры, отправлять ответы со статусом 200 с объектами JSON, а также ошибки с пользовательскими сообщениями.

package com.cvillaseca.mobileapi.controller

import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod
import org.springframework.web.bind.annotation.RestController
import kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType

@RestController
@RequestMapping("/mobileApi")
class HelloController {
    @RequestMapping(value = ["/helloWorld"], method = [(RequestMethod.GET)])
    fun getHelloWordMessage(): ResponseEntity<String> =
        ResponseEntity.ok("Hello World")

    @RequestMapping(value = ["/helloWorld/{name}"], method = [(RequestMethod.GET)])
    fun getHelloWordMessageWithName(
        @PathVariable("name") name: String
    ): ResponseEntity<Any> =
        if (name != "Cristian") {
            ResponseEntity.ok(
                HelloResponse(
                    message = "Hello $name",
                    name = name
                )
            )
        } else {
            ResponseEntity.badRequest().body("I am Cristian")
        }
}

data class HelloResponse(
    val message: String,
    val name: String
)

Чтобы убедиться, что наш первый веб-сервис работает, нам сначала нужно развернуть его на своей локальной машине. Это мы можем сделать, запустив команду gradle bootRun. После этого проверяем, что всё работает ожидаемым образом, используя curl.

curl --location --request GET 'http://localhost:8080/mobileApi/helloWorld'

Если вы предпочитаете графический интерфейс, а также хотите, чтобы ваши API оставались организованными и синхронизированными, рекомендую тестировать API с помощью бесплатной программы Postman. На картинке ниже вы можете увидеть, как протестировать контроллер, который мы только что создали.

Вот и всё!

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Cristian Villaseca: How to create a REST API for your App with Spring Boot, Kotlin & Gradle (Part 1: Initial setup & Controller)

Предыдущая статьяТеория графов в кратком и практичном изложении
Следующая статьяPython: как заменить циклы For на Map, Filter и Reduce