苹果的 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。幸运的是我们已经有了 Swifter 和 Taylor,再配之以纯 Swift 的模板实现 GRMustache, 简单开发不在话下。
一旦该语言流行开了,特别是能用在 Linux 平台下,总会有人去实现出对 HTTP 协议的支持,再配之以模板,让 Swift 像 PHP 一样在 Apache 中运行就不难了。
下面是收集的几个简单应用例子:
CGI 方式: 可存成 TestCGI, 属性改为可执行,放在 Web 下的 /cgi-bin,让 HTTP Server 允许对该目录下的文件的执行权限,http://localhost/cgi-bin/TestCGI 就能看到页面了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/usr/bin/env xcrun swift import Foundation println("Content-Type: text/html") println("Content:") println("") println("1. Process.argument(s):<br />") for s in Process.arguments { println(s + "<br />") } println("<br />") let env: Dictionary = NSProcessInfo().environment if let requestMethod: Optional = env["REQUEST_METHOD"] { println("2. Request method is: \(requestMethod!)<br /><br />") } println("3. Number of environment variables: \(env.count)<br /><br />") println("4. List environment:<br />") for key in env.keys { println("\(key) == \(env[key]!)<br />") } |
Swifter 实现: 是不是像 NodeJs 的意味,也定义的路由
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import Swifter let server = HttpServer() server["/"] = { request in return .OK(.HTML("Hello World!")) } var e: NSError? if !server.start(3002, error: &e) { print("Server start error: \(e)") } else { NSRunLoop.mainRunLoop().run } |
Taylor 实现: 也像 NodeJs 一样, 有了 req 和 res 显得更正式了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import Taylor let server = Taylor.Server() server.get("/") { req, res, cb in res.bodyString = "Hello World!" cb(.Send(req, res)) } do { try server.serveHTTP(port: 3001, forever: true) } catch let e { print("Server start failed \(e)") } |
GRMustache 模板应用
document.mustache 模板文件:
1 2 3 4 5 |
Hello {{name}} Your beard trimmer will arrive on {{format(date)}}. {{#late}} Well, on {{format(realDate)}} because of a Martian attack. {{/late}} |
把变量合并到模板中去的实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import Mustache // Load the `document.mustache` resource of the main bundle let template = try Template(named: "document") // Let template format dates with `{{format(...)}}` let dateFormatter = NSDateFormatter() dateFormatter.dateStyle = .MediumStyle template.registerInBaseContext("format", Box(dateFormatter)) // The rendered data let data = [ "name": "Arthur", "date": NSDate(), "realDate": NSDate().dateByAddingTimeInterval(60*60*24*3), "late": true ] // The rendering: "Hello Arthur..." let rendering = try template.render(Box(data)) |
参考:
- Server Side Swift question by Shinichi Goto
- Can you use Swift as a web programming language?
- Swift scripts: How to write small command line scripts in Swift
- 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 Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。