Создание веб-сервиса с помощью Vapor
Исходный код этого руководства можно найти на GitHub
Установка Swift
Для начала работы, установите Swift, чтобы начать использовать его на macOS, Linux или Windows.
Подсказка: Чтобы проверить, что Swift установлен, выполните
swift --versionиз вашей оболочки или приложения терминала.
Swift поставляется с Swift Package Manager (SwiftPM), который управляет распространением кода Swift. Он позволяет легко импортировать другие Swift пакеты в ваши приложения и библиотеки, что делает его ценным инструментом для любого разработчика Swift.
Swift лицензируется по Apache License, Version 2.0.
Выбор веб-фреймворка
За эти годы сообщество Swift создало несколько веб-фреймворков, призванных помочь в создании веб-сервисов. Это руководство фокусируется на веб-фреймворке Vapor, популярном выборе в сообществе.
Установка Vapor
Сначала вам нужно установить Vapor toolbox. Если у вас уже установлен Homebrew на macOS, выполните
brew install vapor
Если вы работаете на другой ОС или хотите установить toolbox из исходного кода, см. документацию Vapor для получения инструкций.
Создание проекта
Затем в терминале в каталоге, где вы хотите создать новый проект, выполните:
vapor new HelloVapor
Это загрузит шаблон и задаст вам ряд вопросов для создания простого проекта со всем необходимым для начала. Это руководство создаст простой REST API, для отправки и получения JSON. Поэтому ответьте «нет» на все остальные вопросы. Вы увидите, что проект успешно создан:
Перейдите в созданный каталог и откройте проект в вашем IDE. Например, для использования VSCode выполните:
cd HelloVapor
code .
Для Xcode выполните:
cd HelloVapor
open Package.swift
Шаблон Vapor содержит ряд файлов и функций, уже настроенных для вас. configure.swift содержит код для настройки вашего приложения, а routes.swift содержит код обработчиков маршрутов.
Создание маршрутов
Сначала откройте routes.swift и создайте новый маршрут, чтобы поздороваться с любым, кто посещает ваш сайт, объявив новый маршрут ниже app.get("hello") { ... }:
// 1
app.get("hello", ":name") { req async throws -> String in
// 2
let name = try req.parameters.require("name")
// 3
return "Hello, \(name.capitalized)!"
}
Вот что делает код:
- Объявляет новый обработчик маршрутов, зарегистрированный как запрос GET на
/hello/<NAME>.:обозначает динамический параметр пути в Vapor и будет соответствовать любому значению, позволяя вам получить его в обработчике маршрута.app.get(...)принимает замыкание в качестве последнего параметра, которое может быть асинхронным и должно возвращатьResponseили что-либо, соответствующее протоколуResponseEncodable, например,String. - Получает имя из параметров. По умолчанию это возвращает
String. Если вы хотите извлечь другой тип, например,IntилиUUID, вы можете написатьreq.parameters.require("id", as: UUID.self), и Vapor попытается преобразовать его в тип и автоматически сгенерирует ошибку, если это не удастся. Это вызывает ошибку, если маршрут не был зарегистрирован с правильным именем параметра. - Возвращает
Response, в данном случаеString. Обратите внимание, что вам не нужно устанавливать код состояния, тело ответа или какие-либо заголовки. Vapor обрабатывает все это за вас, позволяя при этом контролировать возвращаемоеResponse, если это необходимо.
Сохраните файл, скомпилируйте и запустите приложение:
$ swift run
Building for debugging...
...
Build complete! (59.87s)
[ NOTICE ] Server starting on http://127.0.0.1:8080
Отправьте запрос GET на http://localhost:8080/hello/tim. Вы получите ответ:
$ curl http://localhost:8080/hello/tim
Hello, Tim!
Попробуйте с разными именами, чтобы увидеть, как это автоматически изменится!
Возврат JSON
Vapor использует Codable под капотом, чтобы легко отправлять и получать JSON, используя оберточный протокол Content для добавления нескольких дополнительных функций. Далее вы вернёте тело JSON с сообщением из маршрута Hello!. Сначала создайте новый тип внизу routes.swift:
struct UserResponse: Content {
let message: String
}
Это определяет новый тип, который соответствует Content, который соответствует JSON, который вы хотите вернуть.
Создайте новый маршрут ниже app.get("hello", ":name") { ... }, чтобы вернуть этот JSON:
// 1
app.get("json", ":name") { req async throws -> UserResponse in
// 2
let name = try req.parameters.require("name")
let message = "Hello, \(name.capitalized)!"
// 3
return UserResponse(message: message)
}
Вот что делает этот код:
- Определяет новый обработчик маршрута, который обрабатывает запрос GET на
/json. Важно, что тип возврата для замыкания -UserResponse. - Получает имя, как и прежде, и строит сообщение.
- Возвращает
UserResponse.
Сохраните, скомпилируйте и снова запустите приложение, а затем отправьте запрос GET на http://localhost:8080/json/tim:
$ curl http://localhost:8080/json/tim
{"message":"Hello, Tim!"}
На этот раз вы получаете JSON!
Обработка JSON
Наконец, мы рассмотрим, как получить JSON. Внизу routes.swift создайте новый тип для моделирования JSON, который вы будете отправлять в приложение сервера:
struct UserInfo: Content {
let name: String
let age: Int
}
Он содержит два свойства: имя и возраст. Затем, под маршрутом JSON, создайте новый маршрут для обработки запроса POST с этим телом:
// 1
app.post("user-info") { req async throws -> UserResponse in
// 2
let userInfo = try req.content.decode(UserInfo.self)
// 3
let message = "Hello, \(userInfo.name.capitalized)! You are \(userInfo.age) years old."
return UserResponse(message: message)
}
Важные отличия в этом новом обработчике маршрута:
- Используйте
app.post(...)вместоapp.get(...), так как этот обработчик маршрута - запрос POST. - Декодируйте JSON из тела запроса.
- Используйте данные из тела JSON для создания нового сообщения.
Отправьте запрос POST со корректным телом JSON и посмотрите свой ответ:
$ curl http://localhost:8080/user-info -X POST -d '{"name": "Tim", "age": 99}' -H "Content-Type: application/json"
{"message":"Hello, Tim! You are 99 years old."}
Поздравляем! Вы создали свой первый веб-сервер на Swift!
Исходный код этого руководства можно найти на GitHub
The Swift Programming Language, Copyright © 2014-2025 Apple Inc.
Swift and the Swift logo are trademarks of Apple Inc.
Documentation for Swift 6.0.3
https://www.swift.org/getting-started/vapor-web-server