Swift 语言 Server 端开发资料收集

苹果的 Swift 语言第二版预计在今年底开源,届时还可在 Linux 下使用 Swift 语言。试想一下此语言用在服务端 Web 开发也该是个很好的方向,需要实现对  HTTP 协议的支持。


Swift 本身就可以做 Shell 脚本用,所以以 CGI 的方式运行是没问题的,没有第三方相关的框架,可以自己完全输出响应头和体。

我们可以把 Swift 集成到像 Apache 或 Nginx 的 Web 服务器中,要做的工作可能多些,应该要用到 C/C++ 来写 Swift 支持模块。想下我们用这种 URL http://localhost/service/customer.swift 来访问 swift 实现的后台页面。

或者也可以让 Swift 代码像 NodeJs 一样运行,自己启动 HTTP Server。幸运的是我们已经有了 SwifterTaylor,再配之以纯 Swift 的模板实现 GRMustache, 简单开发不在话下。

一旦该语言流行开了,特别是能用在 Linux 平台下,总会有人去实现出对 HTTP 协议的支持,再配之以模板,让 Swift 像 PHP 一样在 Apache 中运行就不难了。

下面是收集的几个简单应用例子:

CGI 方式: 可存成 TestCGI, 属性改为可执行,放在 Web 下的 /cgi-bin,让 HTTP Server 允许对该目录下的文件的执行权限,http://localhost/cgi-bin/TestCGI 就能看到页面了。
 1#!/usr/bin/env xcrun swift
 2
 3import Foundation
 4
 5println("Content-Type: text/html")
 6println("Content:")
 7println("")
 8println("1. Process.argument(s):<br />")
 9for s in Process.arguments {
10    println(s + "<br />")
11}
12println("<br />")
13
14let env: Dictionary = NSProcessInfo().environment
15
16if let requestMethod: Optional = env["REQUEST_METHOD"] {
17    println("2. Request method is: \(requestMethod!)<br /><br />")
18}
19
20println("3. Number of environment variables: \(env.count)<br /><br />")
21
22println("4. List environment:<br />")
23for key in env.keys {
24    println("\(key) == \(env[key]!)<br />")
25}

Swifter 实现: 是不是像 NodeJs 的意味,也定义的路由
 1import Swifter
 2
 3let server = HttpServer()
 4server["/"] = { request in
 5    return .OK(.HTML("Hello World!"))
 6}
 7
 8var e: NSError?
 9if !server.start(3002, error: &e) {
10    print("Server start error: \(e)")
11} else {
12    NSRunLoop.mainRunLoop().run
13}

Taylor 实现: 也像 NodeJs 一样, 有了 req 和 res 显得更正式了
 1import Taylor
 2
 3let server = Taylor.Server()
 4server.get("/") {
 5    req, res, cb in
 6        res.bodyString = "Hello World!"
 7        cb(.Send(req, res))
 8}
 9
10do {
11    try server.serveHTTP(port: 3001, forever: true)
12} catch let e {
13    print("Server start failed \(e)")
14}

GRMustache 模板应用

document.mustache 模板文件:
1Hello {{name}}
2Your beard trimmer will arrive on {{format(date)}}.
3{{#late}}
4Well, on {{format(realDate)}} because of a Martian attack.
5{{/late}}

把变量合并到模板中去的实现代码:
 1import Mustache
 2
 3// Load the `document.mustache` resource of the main bundle
 4let template = try Template(named: "document")
 5
 6// Let template format dates with `{{format(...)}}`
 7let dateFormatter = NSDateFormatter()
 8dateFormatter.dateStyle = .MediumStyle
 9template.registerInBaseContext("format", Box(dateFormatter))
10
11// The rendered data
12let data = [
13    "name": "Arthur",
14    "date": NSDate(),
15    "realDate": NSDate().dateByAddingTimeInterval(60*60*24*3),
16    "late": true
17]
18
19// The rendering: "Hello Arthur..."
20let rendering = try template.render(Box(data))

参考:
  1. Server Side Swift question by Shinichi Goto
  2. Can you use Swift as a web programming language?
  3. Swift scripts: How to write small command line scripts in Swift
  4. Scripting in Swift is Pretty Awesome

Google 关键字:  swift scripting, swift http server



snell https://github.com/jonklein/snell 这个比较接近了, 可以 CGI 或单独运行,swtl 模板和 JSP 一样的用法来嵌入代码
http://perfect.org/ 这个说的漂亮,但没有一个最简单的 Hello World. 永久链接 https://yanbin.blog/swift-server-side-development/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。