Серверный Swift с Vapor

rom
rom
Sep 11, 2017 · 5 min read

Всем привет!

Иногда наступает такой момент, когда парсить JSON надоедает. 😱 Тогда хочется посмотреть, а что еще интересного есть в этих наших Свифтах, помимо анимаций и бесконечных вариаций лейаутов. Ну и внезапно натыкаешься на server-side Swift.

“Server-side swift? Зачем?” — по крайней мере я так подумал, когда в прошлом году впервые наткнулся на какую-то статью с похожим заголовком. Какие вообще могут быть причины для того, чтобы писать server-side на Свифте? 🤔 Есть же rails там, node.js, Django и еще много всего, что позволит написать server-side быстро и без особых проблем.

Выясняется, причины есть.

Когда в декабре 2015 Apple открыла исходники Свифта, его стало возможно запускать на Линуксе. То есть, почти везде. Начиная от всяких там облачных сервисов, до Raspberry Pi. Кроме этого, можно добавить, что Свифт:

  1. Статически типизированный (если сильно не вдаваться в детали, то код на Свифте потребляет меньше памяти и помогает нам экономить деньги на облачных сервисах, ибо они рассчитывают стоимость, исходя из потребления памяти)
  2. Безопасный
  3. Быстрый
  4. Экспрессивный

Последние три я прямо с https://swift.org/about/ скопипастил 😅

Короче говоря, как язык он точно неплох, и использовать его можно, а как показали дальнейшие поиски, некоторые компании его уже и в продакшене используют.

Итак, раз уж мы решили написать server-side Свифт приложение, давайте рассмотрим, какие у нас есть варианты. В целом, к настоящему времени их 4:

  1. Vapor
  2. Perfect
  3. Kitura
  4. Zewo

За последние две недели я попробовал все, кроме Zewo, и решил остановиться на Vapor.

Почему Vapor?

Во-первых, очень хорошая документация, найти ее можно здесь. Понятная, подробная, с примерами — все, как мы любим.

Во-вторых, swifty-синтаксис. По сравнению с perfect, в котором лично мне не всегда было очевидно, что и как работает, vapor гораздо более экспрессивный. Хотя, может быть, это субъективно.

В-третьих, комьюнити. Если перейдете по ссылке, то сможете подключиться к каналу в Слаке, там куча полезной инфы, туториалы, help и все такое. Канал, как водится, англоязычный.

В качестве последнего аргумента приведу вот это. Мне кажется, это одна из первых вакансий server-side Swift разработчика. Собственно, хотят Vapor 😏

Думаю, в качестве причин достаточно. Давайте уже приступим и создадим наше первое server-side приложение на Свифте 😁

Для того, чтобы следовать этому туториалу, вам понадобится Xcode (можно скачать в App Store)

Если вы установили Xcode только сейчас, давайте проверим, что у нас установилась нужная версия Swift:

Если все в порядке, перейдем на сайт Vapor и установим его:

Обратите внимание, что Vapor устанавливается через Homebrew, так что, он уже должен у вас быть 😉

Добавим Homebrew Tap, он даст Homebrew возможность устанавливать любые пакеты для Vapor.

Ну и, наконец,

Поздравляем, вы только что установили Vapor 😎

Теперь создадим новый проект.

Переходим в директорию, где мы хотим разместить проект и в терминале пишем:

Ура, мы создали первый проект на Vapor. Переходим в папку и пишем:

По умолчанию Vapor запускается на localhost:8080, о чем нам подскажет терминал:

Теперь переходим на http://localhost:8080/hello/, и Vapor выдаст нам helloworld json :)

Можно парсить! 😆

Но это ведь только начало, давайте создадим Xcode проект и немного оглядимся вокруг, что поставляет нам Vapor “из коробки”. Останавливаем сервер через control-c и пишем:

Придется немного подождать (в среднем это может до 2–3 минут занять, можно пока чаю налить 😏)

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

Если у вас стоит Xcode 9 beta в качестве основного, то вы получите кучу ошибок в связи со SWIFT_VERSION, и проект не запустится. Что с этим делать:

Копируем SWIFT_VERSION в поиск

И ручками исправляем все swift 4 на swift 3.

Итак, собрали, перейдем еще раз на http://localhost:8080/hello/ и удостоверимся, что все в порядке, json на месте. На месте? Отлично 👌

Теперь посмотрим, что у нас в папке с проектом.

  1. Package. Аналог Bundle в рельсах. Здесь мы прописываем зависимости и их версии.
  2. Sources, внутри которых две папки App и Run
  3. Внутри папки Run мы обнаружим setup конфигурации и Droplet. Собственно, Drop — это то, где конфигурируется раутинг приложения.
  4. Папка App содержит руты, их setup, а также модели и контроллеры

В рамках этого туториала мы будем работать в файле Routes.swift. Перейдем туда и увидим все руты, которые Vapor создает нам из коробки. На самом деле, их там не так уж много, и все get.

Давайте создадим и пост, который вернет нам json с отправленным в него именем 😉

Итак, пишем:

Так как Vapor просит от нас что-то вернуть в post методе, давайте вернем.

Пока так 😊

Билд, ран, а теперь давайте запостим что-нибудь в наш http://localhost:8080/name/

Лично я для тестов API использую Paw, но вы можете выбрать тот инструмент, с которым вам комфортнее 😉

Paw говорит, что все в порядке. Давайте посмотрим, что отобразилось в дебаггере:

Отлично, имя мы запустили, осталось собрать из него json и вернуть обратно в ответе:

Проверяем, все должно быть в порядке.

В дебаггере тоже должен отобразится полученный json 🔥

Но можно сделать и получше 😉

Или даже еще лучше 🤔

Предела совершенству нет 😆

Итак, я нас поздравляю, сегодня мы установили Vapor, создали новый проект, выполнили парочку get и создали собственный post 😎

Надеюсь, это было не скучно, в следущий раз мы попробуем разобраться, как отобразить все это на view с помощью leaf templating language.

Ну и, как обычно, лайк — репост 😏

rom

Written by

rom

swift/obj-c, ruby, c/c++, software engineering. So amazing, very bleeding edge.