Project Perfect讓Swift在服務器端跑起來-引言(一)

編者語:今天是大年初一,先和你們簡單說一句猴年快樂!html

       

       你認識Swift或者是在客戶端,由於它是蘋果用來開發客戶端的新一代語言。在Swift開源後蘋果讓它不只在MacOS/iOS上跑,也運行到了Linux ,而第三方公司RemObject把Swift帶到了Android,也帶到了Windows(Windows Form/WPF/Universal Windows App) 。能夠說Swift已是一個完整的跨平臺語言了。但有人會說Swift缺乏了作服務器端的能力,如網站,接口等,如今Perfect就是一個很不錯的項目能完成網站開發/數據接口等服務端的工做。今天開始我會介紹給你們。mysql

       Perfect讓Swift在服務器端跑起來了,它是開源的。你能夠經過官網http://www.perfect.org (這個須要佛跳牆)瞭解它,也能夠從它的Github上下載最新的源碼 https://github.com/PerfectlySoft/Perfect/。如下是在Perfect網站上一個重要的介紹, 這真的是一個很cool 的項目。git

       

         Perfect主要提供了三塊主要的功能一個是從服務器端到客戶端都適用的PerfectLib(包括了一些簡單的操做如JSON或者是WebHandler的相關操做),其次是一個FastCGI和HTTP服務的容器去支持Perfect在服務端的運行,還有一個Connector這個主要用來和一些服務器基礎服務打交道(如和Apache接入,還有數據庫連接等現階段支持MySQL,MongoDB, PostgerSQL還有SQLite).github

        Perfect在服務器端是如何運做的?咱們先來看看。sql

         

       從上面的圖能夠看出,這和咱們的rails思想差很少,若是你熟悉.NET MVC/Java Spark !/Ruby on Rails是,那再遷移過來是很快的事情。咱們來看看如何來建立一個Perfect項目並建立一個簡單的WebAPI。數據庫

      1.  先把Perfect從Github拉下來 Git clone https://github.com/PerfectlySoft/Perfect.gitjson

      2.  下載完後,第一件事情不是編碼,是把Perfect模版添加到Xcode內。模版放在Extras目錄下(如圖)swift

      

       而後只須要把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上飛,下篇見

相關文章
相關標籤/搜索