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

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

       

       你认识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进行修改

 

[plain] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. import PerfectLib  
  2. import MySQL  
  3.   
  4.   
  5. let HOST = "你的数据库链接"  
  6. let USER = "你的帐号"  
  7. let PASSWORD = "你的密码"  
  8. let SCHEME = "你的数据库"  
  9.   
  10. public func PerfectServerModuleInit() {  
  11.       
  12.     Routing.Handler.registerGlobally()  
  13.     Routing.Routes["GET", ["/"]] = { (_:WebResponse) in return PerfectHandler() }  
  14.     print("\(Routing.Routes.description)")  
  15. }  
  16.   
  17. //Create a handler for index Route  
  18. class PerfectHandler: RequestHandler {  
  19.       
  20.     func handleRequest(request: WebRequest, response: WebResponse) {  
  21.           
  22.         response.addHeader("Content-Type", value: "application/json")  
  23.         response.addHeader("Content-Type", value: "text/html; charset=utf-8")  
  24.           
  25.         let mysql = MySQL()  
  26.         let connect = mysql.connect(HOST, user: USER, password: PASSWORD)  
  27.         if(connect)  
  28.         {  
  29.             let sres = mysql.selectDatabase(SCHEME)  
  30.             if(sres)  
  31.             {  
  32.                   
  33.                 let sres2 = mysql.query("SELECT name,memo FROM Info")  
  34.                   
  35.                 if(sres2)  
  36.                 {  
  37.                     let results = mysql.storeResults()!  
  38.                       
  39.                       
  40.                       
  41.                     if(results.numRows()==0)  
  42.                     {  
  43.                         do{  
  44.                               
  45.                               
  46.                             let encoder = JSONEncoder()  
  47.                             let data = try encoder.encode(["result": ""])  
  48.                             response.appendBodyString(data)  
  49.                         }  
  50.                         catch{  
  51.                             response.setStatus(500, message: "Could not create data")  
  52.                         }  
  53.                     }  
  54.                     else  
  55.                     {  
  56.                         var dataArray:Array<AnyObject> = []  
  57.                         var dict = Dictionary<String,String>()  
  58.                         while let row = results.next() {  
  59.                               
  60.                             dict["name"]=row[0];  
  61.                             dataArray.append(dict)  
  62.                               
  63.                         }  
  64.                           
  65.                         print(NSJSONSerialization.isValidJSONObject(dataArray))  
  66.                           
  67.                           
  68.                         do {  
  69.                               
  70.                               
  71.                             let dataFinal = try NSJSONSerialization.dataWithJSONObject(dataArray, options:NSJSONWritingOptions(rawValue:0))  
  72.                               
  73.                             let string = NSString(data: dataFinal, encoding: NSUTF8StringEncoding)  
  74.                               
  75.                             let tee : String = string as! String  
  76.                             response.appendBodyString(tee)  
  77.                         }  
  78.                         catch{  
  79.                             response.setStatus(500, message: "Could not create data")  
  80.                         }  
  81.                           
  82.                           
  83.                           
  84.                     }  
  85.                       
  86.                       
  87.                       
  88.                       
  89.                     results.close()  
  90.                 }  
  91.             }  
  92.             mysql.close()  
  93.         }  
  94.         response.requestCompletedCallback()  
  95.     }  
  96. }  

        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上飞,下篇见

转载于:https://my.oschina.net/JiangTun/blog/685793

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值