关闭

Project Perfect让Swift在服务器端跑起来-引言(一)

7799人阅读 评论(6) 收藏 举报
分类:

编者语:今天是大年初一,先和大家简单说一句猴年快乐!

       

       你认识Swift或者是在客户端,因为它是苹果用来开发客户端的新一代语言。在Swift开源后苹果让它不仅在MacOS/iOS上跑,也运行到了Linux ,而第三方公司RemObject把Swift带到了Android,也带到了Windows(Windows Form/WPF/Universal Windows App) 。可以说Swift已经是一个完整的跨平台语言了。但有人会说Swift缺少了做服务器端的能力,如网站,接口等,现在Perfect就是一个很不错的项目能完成网站开发/数据接口等服务端的工作。今天开始我会介绍给大家。

       Perfect让Swift在服务器端跑起来了,它是开源的。你可以通过官网http://www.perfect.org (这个需要佛跳墙)了解它,也可以从它的Github上下载最新的源码 https://github.com/PerfectlySoft/Perfect/。以下是在Perfect网站上一个重要的介绍, 这真的是一个很cool 的项目。

       

         Perfect主要提供了三块主要的功能一个是从服务器端到客户端都适用的PerfectLib(包括了一些简单的操作如JSON或者是WebHandler的相关操作),其次是一个FastCGI和HTTP服务的容器去支持Perfect在服务端的运行,还有一个Connector这个主要用来和一些服务器基础服务打交道(如和Apache接入,还有数据库链接等现阶段支持MySQL,MongoDB, PostgerSQL还有SQLite).

        Perfect在服务器端是如何运作的?我们先来看看。

         

       从上面的图可以看出,这和我们的rails思想差不多,如果你熟悉.NET MVC/Java Spark !/Ruby on Rails是,那再迁移过来是很快的事情。我们来看看如何来创建一个Perfect项目并创建一个简单的WebAPI。

      1.  先把Perfect从Github拉下来 git clone https://github.com/PerfectlySoft/Perfect.git

      2.  下载完后,第一件事情不是编码,是把Perfect模版添加到Xcode内。模版放在Extras目录下(如图)

      

       然后只需要把Extras/Xcode Templates/Perfect 拷贝到/Users/用户名/Library/Developer/Xcode/Templates/Project Templates/ 下即可。添加完后你打开Xcode就可以看到Perfect模版了。

       

       3. 把上面开发环境配置好现在就可以开始创建Perfect项目了,我们先来创建一个WorkSpace(如果你不太懂看下图),叫PerfectSample

       

       4. 创建成功后,分别先把PerfectLib,PerfectServer,MySQL引入WorkSpace中,由于用到不同的基础服务所以必须引入。PerfectLib你可以理解成Perfect框架,而PerfectServer是启动支持Perfect的类似IIS/Apache的容器,MySQL是需要介入MySQL Connector

      

      5. 利用Perfect模版创建PerfectWeb项目,如图我创建了一个HelloWorld的项目。如图这个和我们创建Cocoa Framework一致的。当然你可以不需要这个模版,直接从Cocoa Framework模版上创建。

      

      项目里面就包含了一个Handler和一个对应的mustache模版。但这个时候还是不能运行的,你必须把PerfectLib/MySQL Connector引用进来,如下图,这里需要注意PerfectLib是引用PerfectLibOSX版本。

      

     完成添加这两个库后还需要配置Buiding Scheme ,如图,因为你启动需要PerfectServer所以你需要把executable改成PerfectServer.app ,并把Shared项目钩上。

     

     6. 对PerfectHandler.swift进行修改


import PerfectLib
import MySQL


let HOST = "你的数据库链接"
let USER = "你的帐号"
let PASSWORD = "你的密码"
let SCHEME = "你的数据库"

public func PerfectServerModuleInit() {
    
    Routing.Handler.registerGlobally()
    Routing.Routes["GET", ["/"]] = { (_:WebResponse) in return PerfectHandler() }
    print("\(Routing.Routes.description)")
}

//Create a handler for index Route
class PerfectHandler: RequestHandler {
    
    func handleRequest(request: WebRequest, response: WebResponse) {
        
        response.addHeader("Content-Type", value: "application/json")
        response.addHeader("Content-Type", value: "text/html; charset=utf-8")
        
        let mysql = MySQL()
        let connect = mysql.connect(HOST, user: USER, password: PASSWORD)
        if(connect)
        {
            let sres = mysql.selectDatabase(SCHEME)
            if(sres)
            {
                
                let sres2 = mysql.query("SELECT name,memo FROM Info")
                
                if(sres2)
                {
                    let results = mysql.storeResults()!
                    
                    
                    
                    if(results.numRows()==0)
                    {
                        do{
                            
                            
                            let encoder = JSONEncoder()
                            let data = try encoder.encode(["result": ""])
                            response.appendBodyString(data)
                        }
                        catch{
                            response.setStatus(500, message: "Could not create data")
                        }
                    }
                    else
                    {
                        var dataArray:Array<AnyObject> = []
                        var dict = Dictionary<String,String>()
                        while let row = results.next() {
                            
                            dict["name"]=row[0];
                            dataArray.append(dict)
                            
                        }
                        
                        print(NSJSONSerialization.isValidJSONObject(dataArray))
                        
                        
                        do {
                            
                            
                            let dataFinal = try NSJSONSerialization.dataWithJSONObject(dataArray, options:NSJSONWritingOptions(rawValue:0))
                            
                            let string = NSString(data: dataFinal, encoding: NSUTF8StringEncoding)
                            
                            let tee : String = string as! String
                            response.appendBodyString(tee)
                        }
                        catch{
                            response.setStatus(500, message: "Could not create data")
                        }
                        
                        
                        
                    }
                    
                    
                    
                    
                    results.close()
                }
            }
            mysql.close()
        }
        response.requestCompletedCallback()
    }
}
        7. 运行,当运行时会启动 PerfectServer.app,然后在浏览器输入0.0.0.0:8080就可以看到JSON结果了。

        

        结果:

        


       好!一个简单的Web API就完成了,当然这是平平无奇,但是用Swift完成了服务器端的开发是感觉不错的事情。Perfect是一个开始,完成度也有待提高,但是我相信很快会有质的飞跃,如即将支持的ORM等。文档不足也是一个很致命的原因,我相信也会很快改善。

       介绍一个不错的blog(需要佛跳墙) http://code-me-dirty.blogspot.co.uk/2016/02/creating-perfect-swift-server.html ,当然你可以看我的连载。

       今天先说到这里,接下来我会让Perfect在Linux上飞,下篇见

1
0
查看评论

Project Perfect让Swift在服务器端跑起来-Hi Linux(二)

Running Perfect in Linux
  • u014388424
  • u014388424
  • 2016-02-15 01:49
  • 4160

今天开始用swift写服务器(一)

用swift写服务器的已经不是什么新鲜事了,这几年的发展,也是swift在服务端的表现越来越成熟,目前比较流行服务端框架主要有Vapor、Perfect、Kitura和Zewo,他们各有长短,本人这次主要是使用Perfect来写的,因为Perfect的功能比较完善,在GitHub上具有1W+的星,而...
  • loveqcx123
  • loveqcx123
  • 2017-04-13 18:48
  • 4026

【代码片-1】 Project Perfect让Swift在服务器端跑起来-引言(一)

作者:u014388424----感谢原创,感谢作者!! 标签:swift    服务器端    project    模版    c...
  • meizheming
  • meizheming
  • 2017-07-23 20:18
  • 262

Project Perfect让Swift在服务器端跑起来-让Perfect更Rails (五)

let Perfect like more Rails
  • u014388424
  • u014388424
  • 2016-02-27 15:08
  • 6759

Project Perfect让Swift在服务器端跑起来-在Linux上创建你的Perfect项目(三)

Linux create Perfect Project .
  • u014388424
  • u014388424
  • 2016-02-24 22:41
  • 3358

Project Perfect让Swift在服务器端跑起来-Perfect in Visual Studio Code (四)

Perfect in Visual Studio Code
  • u014388424
  • u014388424
  • 2016-02-25 22:06
  • 3199

Perfect-Swift Mac环境下的常用指令

Perfect-Swift Mac环境下的常用指令
  • phyky
  • phyky
  • 2017-04-24 16:17
  • 434

用Swift写服务端 — Perfect框架学习(一)

用Swift写服务端 — Perfect框架学习(一)一、Perfect简介Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS和macOS (OS X)上使用。该软件体系为Swift工程师量身定制了一整套用于开发轻量、易维护、规模可扩展的Web应用及其它...
  • u014220518
  • u014220518
  • 2018-01-31 16:05
  • 295

第一章 我的程序是怎么跑起来的?

 第一章 我的程序是怎么跑起来的?在你看到程序跑起来之前,其实编译器和系统为你做了很多工作,它默默地为你奔波着:预处理、编译、汇编、链接,装载……,于是你可以被感动的声泪俱下:原来,我不是一个人……在战斗!1.1 编译过程全景图 1.2 装载是怎么回事? 1.3 本章小...
  • pmpmp2006
  • pmpmp2006
  • 2009-10-07 12:23
  • 3687

自己eclipse中的项目如何利用tomcat跑起来

找到自己项目的WebRoot加压,然后解压到tomcat的webapps目录下 如下: ROOT WebRoot 然后再tomcat中的 server.xml中配置上面WebRoot目录对应的本地路径: 如下:
  • caoxuekun
  • caoxuekun
  • 2017-11-15 14:30
  • 320
    个人资料
    • 访问:152766次
    • 积分:1908
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:0篇
    • 译文:0篇
    • 评论:58条
    最新评论