Vọc chút Server side Swift với Kitura

Chiều chủ nhật, chán như con gián (học tập bác @kiennq).

Hôm trước rảnh rang ngồi code cái Swift Wrapper cho Kipalog API. Khổ nỗi code xong cũng chưa hình dung được sẽ dùng thế nào. Giờ code cái iOS Example Project cũng mệt, lâu không động vào Server side Swift, thôi thì code thử 1 cái web app xem sao.

Ý tưởng

  • Làm một trang web đơn giản call thử các API của Kipalog trong đây.
  • Nhân tiện vọc chút Kitura xem hàng IBM chất lượng thế nào. Nói đến Server side Swift chắc ai cũng biết có 3 framework nổi tiếng là: Perfect, Kitura Vapor. Lần này mình chọn Kitura vì Perfect trước đã dùng rồi, chắc lần sau sẽ thử Vapor.

Chuẩn bị

  • macOS High Sierra
  • XCode 9.4.1

Khởi tạo Project

mkdir KipalogViewer
cd KipalogViewer
swift package init --type executable

Tên folder cũng sẽ là tên Project luôn nên ai thích tên gì nhớ sửa lại cho thích hợp.

Tiếp theo mở file Package.swift thêm package Kitura vào.

open -a Xcode Package.swift

Nội dung file Package.swift như bên dưới.

import PackageDescription

let package = Package(
    name: "KipalogViewer",
    dependencies: [
        .package(url: "https://github.com/IBM-Swift/Kitura.git",
                 from: "2.4.0"),
        .package(url: "https://github.com/IBM-Swift/HeliumLogger.git",
                 from: "1.7.1"),
        .package(url: "https://github.com/nam-dh/KipalogAPI.git",
                 from: "1.0.1")
        ],
    targets: [
        .target(name: "KipalogViewer",
                dependencies: ["Kitura", "HeliumLogger", "KipalogAPI"],
                path: "Sources")
    ]
)

Tạm thời ta add 3 package là Kitura, HeliumLoggerKipalogAPI.

HeliumLogger giúp in log cho đẹp, hiện thị rõ log file nào dòng nào... Thật ra cũng không cần thiết mấy, nhưng package này cũng nhẹ, tạm thời ta cứ thêm vào để debug cho dễ.

KipalogAPI là wrapper mấy API của Kipalog do mình code từ trước.

Sau này khi thêm package mới nào, chú ý cần tạo package vào phần dependencies và cần thêm tên package sử dụng cho từng target (dòng thứ 2 từ dưới lên)

Tạm ổn. Giờ ta build thử xem sao.

swift build

Build ngon không vấn đề.

Compile Swift Module 'KipalogViewer' (5 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/KipalogViewer

Giờ code của ta chưa có gì, nên chạy thử chỉ in ra Hello world thôi.

./.build/debug/KipalogViewer 

Hello, world!
Program ended with exit code: 0

Giờ ta tạo xcodeproj file bằng cách

swift package generate-xcodeproj

Ta sẽ nhận được output như bên dưới

generated: ./KipalogViewer.xcodeproj

Mở file này bằng XCode bình thường.
Để run Project bằng XCode, chú ý chọn Scheme KipalogViewer (màu đen, các scheme khác màu vàng là library).

Thiết lập cho Kitura

Để dễ quản lý, ta tạo file mới đặt tên là Application.swift đặt cùng folder với main.swift.

import Foundation
import Kitura

final class App {
    let router = Router()

    func run() {
        setupRoutes()
        Kitura.addHTTPServer(onPort: 8080, with: router)
        Kitura.run()
    }

    private func setupRoutes() {

    }

Hiện setupRoutes() mình chưa implement gì tạm để trống. Sau này ta sẽ thêm implement sau.

Giờ ta khởi tạo class này trong main.swift.

Tiện thể khởi tạo luôn HeliumLogger.

import Kitura
import HeliumLogger

HeliumLogger.use()

let app = App()
app.run()

Thiết lập cho Kitura đến đây là xong.

Giờ ta có thể chạy swift build để build lại Project, hoặc build bằng XCode đều được.

Sau khi build và run thử, truy cập vào local host ở http://localhost:8080, ta sẽ thấy trang default của Kitura như bên dưới.

kitura-default

Ngon lành cành đào rồi. Giờ bắt đầu test thử Kipalog API thôi.

Test thử Kipalog API

Kipalog API yêu cầu phải truyền token để sử dụng các API liên quan đến post bài, có vẻ loằng ngoằng. API liên quan đến lấy post list thì không cần. Ta thử với các API này trước vậy.

Xem thêm các API ở đây.

Giờ quay lại file Application.swift, thêm vào function setupRoutes() như bên dưới:

router.get("/hot") { request, response, next in
  self.getPostListAndResponse(for: .hot, response: response)
}

Với hàm getPostListAndResponse như bên dưới

private func getPostListAndResponse(for type: KipalogAPI.PostListType, response: RouterResponse) {
  KipalogAPI.shared.getPostList(type: type) { (result) in
    if let posts = result.value {
      response.send("\(posts.count)")
    } else {
      response.send("Error")
    }
  }
}

Không quên import library.

import KipalogAPI

Kipalog API chỉ cho ta lấy 30 post đứng đầu danh sách. Nên nối trả về số 30 ra màn hình tức là API chạy ngon.
Giờ ta build app rồi truy cập thử: http://localhost:8080/hot

Chạy đến đây nếu ngon là coi như đã đi được nửa chặng đường rồi.
Bước tiếp theo là hiện thị list các post sao cho đẹp ra màn hình nữa thôi.

Thay vì response con số posts.count đơn giản, ta response nội dung HTML hoành tráng nữa là xong.

Khổ nỗi mình lại ngu HTML làm sao giờ. Đành nhờ cậy anh Boostrap vậy. Anh này chắc ai cũng quen thuộc rồi.

Cơ mà làm cách nào để truyền data lấy từ Kipalog API vào HTML cho dễ nhỉ? Cái này phải nhờ cậy anh Stencil.
Mình sẽ nói về cách sử dụng các libs này ở phần sau.

Dưới đây là demo trang web sau khi hoàn thành.
kipalog-viewer


Code mình lưu ở đây anh em tham khảo cho ý kiến.
Sản phẩm demo ở đây.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nam Doan

6 bài viết.
13 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
14 3
Blockchain chậm và đắt đỏ Bitcoin xử lý tối đa 7 giao dịch mỗi giây, không phải cho từng người tham gia, mà là toàn mạng lưới. Ethereum xử lý 15 ...
Nam Doan viết hơn 2 năm trước
14 3
White
7 7
Ethereum đang chuyển từ Proof of Work sang Proof of Stake. (Link) (smart contract cho phép sử dụng Proof of Stake) vừa được cộng đồng Ethereum Dev...
Nam Doan viết hơn 2 năm trước
7 7
White
5 0
Trong bài viết trước ((Link)), ta đã tìm hiểu về sự khác nhau của 2 cách thức đồng thuận trong Blockchain là Proof of Work (PoW) và Proof of Stake ...
Nam Doan viết hơn 2 năm trước
5 0
Bài viết liên quan
White
14 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết hơn 5 năm trước
14 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
13 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!