12/08/2018, 18:10

[Swift] Xây dựng những API đầu tiên sử dụng Vapor framwork

Chào các bạn, trong bài viết trước Bắt đầu với Vapor tôi đã giới thiệu đến các bạn web framwork Vapor cực kì mạnh mẽ trên nền tảng ngôn ngữ swift. Phần tiếp theo trong phần giới thiệu về Vapor framwork này tôi sẽ giới thiệu đến các bạn cách xây dựng API sử dụng nó. App demo, xây dựng các API: ...

Chào các bạn, trong bài viết trước Bắt đầu với Vapor tôi đã giới thiệu đến các bạn web framwork Vapor cực kì mạnh mẽ trên nền tảng ngôn ngữ swift. Phần tiếp theo trong phần giới thiệu về Vapor framwork này tôi sẽ giới thiệu đến các bạn cách xây dựng API sử dụng nó.

App demo, xây dựng các API:

  • Get list user
  • Tạo mới user
  • Sửa user
  • Xoá user
  • Viết app iOS

Chúng ta tạo project với Bắt đầu với Vapor, và và tiếp tục với ProjectDemo tôi đã thực hiện trong phần trước.

Tạo model User

import Vapor
import FluentSQLite

final class User: SQLiteModel {
    var id: Int?
    var name: String?
    var age: Int?
    
    var postision: String?
    
    init(id: Int? = nil, name: String?, age: Int?, postision: String?) {
        self.id = id
        self.name = name
        self.age = age
        self.postision = postision
    }
}

extension User: Migration { }

extension User: Content { }

extension User: Parameter { }

Configure migrations

Bạn phải thực hiện config các service mà bạn dùng, như ở đây tôi sử dụng DB là sqlite.

    var migrations = MigrationConfig()
    migrations.add(model: User.self, database: .sqlite)
    services.register(migrations)

Controller

Controller chính là nơi bạn thực hiện các logic request và respone của API.

final class UserViewController {
    func index(_ req: Request) throws -> Future<[User]> {
        return User.query(on: req).all()
    }
    
    /// Saves a decoded `User` to the database.
    func create(_ req: Request) throws -> Future<User> {
        return try req.content.decode(User.self).flatMap { todo in
            return todo.save(on: req)
        }
    }
    
    /// Deletes a parameterized `User`.
    func delete(_ req: Request) throws -> Future<HTTPStatus> {
        return try req.parameters.next(User.self).flatMap { user in
            return user.delete(on: req)
            }
            .transform(to: .ok)
    }
}

Router

Router chính là nơi các bạn khai báo các path của API, ở đây tôi thực hiện thiết kết API theo chuẩn RESTful.

let userController = UserViewController()
    router.get("users", use: userController.index)
    router.post("users", use: userController.create)
    router.delete("users", User.parameter, use: userController.delete)

Build Project và bây giờ các bạn đã thực hiện tạo các API get, post và delete User rồi đó, bạn có thể sử dụng Postman để test các API của mình trước khi đi vào sử dụng chúng. Sau khi build thì các bạn sẽ test trên môi trường locahost, khi test tất cả ok rồi thì mới nên thực hiện việc deploy lên cloud, như ở đây tôi đã deploy lên server

Chủ yếu phần xây dựng App này là để chúng ta cùng kiểm tra các API mình đã thực hiện phía trên, cho nên phần này tôi sẽ nói qua thôi.

Get API:

import Foundation
import ObjectMapper
import RxSwift

protocol GetUserServiceProtocol {
    func getUserList(_ input: GetUserServiceInput) -> Observable<GetUserServiceOutput>
}

class GetUserService: APIService, GetUserServiceProtocol {
    func getUserList(_ input: GetUserServiceInput) -> Observable<GetUserServiceOutput> {
        return requestParseJSONToArrayModel(input)
            .map({ (userList) -> GetUserServiceOutput in
                return GetUserServiceOutput(userList: userList)
            })
    }
}

class GetUserServiceInput: APIInputBase {
    init() {
        let url = APIURLs.shared.getFullFormatUrl(pathUrl: APIURLs.login) // https://vapordemo-dev-vapordemo.vapor.cloud/users
        super.init(urlString: url, requestMethod: .get, parameters: nil)
    }
}

class GetUserServiceOutput: APIOutputBase {
    var userList = [User]()
    
    init(userList: [User]) {
        self.userList = userList
        super.init()
    }
    
    required init?(map: Map) {
        super.init(map: map)
    }
}

Post API:

protocol CreateUserServiceProtocol {
    func createUserList(_ input: CreateUserServiceInput) -> Observable<CreateUserServiceOutput>
}

class CreateUserService: APIService, CreateUserServiceProtocol {
    func createUserList(_ input: CreateUserServiceInput) -> Observable<CreateUserServiceOutput> {
        return requestParseJSONToModel(input)
    }
}

class CreateUserServiceInput: APIInputBase {
    init(name: String?, age: Int?, postision: String?) {
        var params: [String: Any] = [:]
        if let name = name {
            params["name"] = name
        }
        
        if let age = age {
            params["age"] = age
        }
        
        if let postision = postision {
            params["postision"] = postision
        }
        let url = APIURLs.shared.getFullFormatUrl(pathUrl: APIURLs.login)
        super.init(urlString: url, requestMethod: .post, parameters: nil)
    }
}

class CreateUserServiceOutput: APIOutputBase {
    var userList = [User]()
    
    init(userList: [User]) {
        self.userList = userList
        super.init()
    }
    
    required init?(map: Map) {
        super.init(map: map)
    }
}

Trên đây tôi đã giới thiệu cách để tạo một API sử dụng Vapor Framwork, giờ đây các bạn có thể chỉ sử dụng một ngôn ngữ duy nhất là Swift mà có thể làm được cả client và server, điều này càng tuyệt vời hơn khi mà Android cũng dần chuyển sang ngôn ngữ Kotlin, điều này có nghĩa là các bạn chỉ các viết app Swift mà có thể convert sang Kotlin để sử dụng cho app android, thật là tuyệt vời phải không nào. Ở ví dụ trên của tôi, tôi sử dụng DB là Sqlite, trong phần tiếp theo, tôi sẽ cùng các bạn tìm hiểu làm sao để kết nối đến Database sử dụng MySQL. Cám ơn các bạn đã đọc bài Project Demo Link: Server Client

0