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

你认识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/JavaSpark!/Ruby on Rails是,那再迁移过来是很快的事情。我们来看看如何来创建一个Perfect项目并创建一个简单的WebAPI。

1. 先把Perfect从Github拉下来Gitclonehttps://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 plaincopy

print?

  1. importPerfectLib
  2. importMysqL
  3. letHOST="你的数据库链接"
  4. letUSER="你的帐号"
  5. letPASSWORD="你的密码"
  6. letSCHEME="你的数据库"
  7. publicfuncPerfectServerModuleInit(){
  8. Routing.Handler.registerGlobally()
  9. Routing.Routes["GET",["/"]]={(_:WebResponse)inreturnPerfectHandler()}
  10. print("\(Routing.Routes.description)")
  11. }
  12. //CreateahandlerforindexRoute
  13. classperfectHandler:RequestHandler{
  14. funchandleRequest(request:WebRequest,response:WebResponse){
  15. response.addheader("Content-Type",value:"application/json")
  16. response.addheader("Content-Type",value:"text/html;charset=utf-8")
  17. letMysqL=MysqL()
  18. letconnect=MysqL.connect(HOST,user:USER,password:PASSWORD)
  19. if(connect)
  20. {
  21. letsres=MysqL.selectDatabase(SCHEME)
  22. if(sres)
  23. {
  24. letsres2=MysqL.query("SELECTname,memoFROMInfo")
  25. if(sres2)
  26. {
  27. letresults=MysqL.storeResults()!
  28. if(results.numRows()==0)
  29. {
  30. do{
  31. letencoder=JSONEncoder()
  32. letdata=tryencoder.encode(["result":""])
  33. response.appendBodyString(data)
  34. }
  35. catch{
  36. response.setStatus(500,message:"Couldnotcreatedata")
  37. }
  38. }
  39. else
  40. {
  41. vardataArray:Array<AnyObject>=[]
  42. vardict=Dictionary<String,String>()
  43. whileletrow=results.next(){
  44. dict["name"]=row[0];
  45. dataArray.append(dict)
  46. }
  47. print(NSJSONSerialization.isValidJSONObject(dataArray))
  48. do{
  49. letdataFinal=tryNSJSONSerialization.dataWithJSONObject(dataArray,options:NSJSONWritingOptions(rawValue:0))
  50. letstring=Nsstring(data:dataFinal,encoding:NSUTF8StringEncoding)
  51. lettee:String=stringas!String
  52. response.appendBodyString(tee)
  53. }
  54. catch{
  55. response.setStatus(500,message:"Couldnotcreatedata")
  56. }
  57. }
  58. results.close()
  59. }
  60. }
  61. MysqL.close()
  62. }
  63. response.requestCompletedCallback()
  64. }
  65. }

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

Project Perfect让Swift在服务器端跑起来-引言一的更多相关文章

  1. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  2. 有没有办法知道购买哪个iTunes帐户? – iOS

    我的应用程序提供应用内购买非消耗类型.该应用程序具有登录功能.是否可以根据登录用户购买我的应用程序?

  3. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  4. ios – 无法识别的选择器发送到实例NSTimer Swift

    解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

  5. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  6. ios – Apple应用程序内购买收据 – 在服务器端验证

    我想验证它,并确保这是独一无二的.我担心的是:如果有人会收到一张有效收据,他就可以破解我们的服务器端API,并使用相同的有效收据进行无限数量的应用内购买.我应该以某种方式解密并检查transaction_id的“原始”收据,即我发送给Apple进行验证的收据?

  7. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  8. ios – 类型推断(自动类型检测)如何在swift中工作?

    LLVM如何检测变量是一个字符串?

  9. ios – Swift可选项:语言问题,还是做错了什么?

    应该有可选的类型;type是但是,如果我这样做,它的工作原理:它似乎是基本的替代,但我可能会遗漏一些语言的细微差别.谁能对此有所了解?之后就像暧昧一样,更多,这是我的解决方案:这适用于所有非对象Swift对象,包括Swift字符串,数字等.感谢Viktor提醒我String不是Swift中的对象.如果您知道值的类型,您可以替换任何?使用适当的可选类型,如String?

  10. ios – 覆盖Swift中的超类委托

    我正在开发一个包含两个UIViews的Swift(v1.2)项目.MyView和MyViewSubclass.MyView有一个委托,我想在MyViewSubclass中覆盖它作为一个子协议,类似于UITableViews有一个UITableViewDelegate,它也符合超级uiscrollviewdelegate.我的第一个想法是覆盖超类属性,但这会导致编译器错误,因为子类不能覆盖具有不同类

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部