Project Perfect让Swift在server端跑起来-引言(一)
编者语:今天是大年初一。先和大家简单说一句猴年快乐!
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
你认识Swift或者是在client,由于它是苹果用来开发client的新一代语言。在Swift开源后苹果让它不仅在MacOS/iOS上跑。也执行到了Linux ,而第三方公司RemObject把Swift带到了Android,也带到了Windows(Windows Form/WPF/Universal Windows App) 。能够说Swift已经是一个完整的跨平台语言了。但有人会说Swift缺少了做server端的能力。如站点。接口等,如今Perfect就是一个非常不错的项目能完毕站点开发/数据接口等服务端的工作。今天開始我会介绍给大家。
Perfect让Swift在server端跑起来了,它是开源的。
你能够通过官网http://www.perfect.org (这个须要佛跳墙)了解它。也能够从它的Github上下载最新的源代码 https://github.com/PerfectlySoft/Perfect/。
下面是在Perfect站点上一个重要的介绍,
这真的是一个非常cool 的项目。
Perfect主要提供了三块基本的功能一个是从server端到client都适用的PerfectLib(包含了一些简单的操作如JSON或者是WebHandler的相关操作)。其次是一个FastCGI和HTTP服务的容器去支持Perfect在服务端的执行,另一个Connector这个主要用来和一些server基础服务打交道(如和Apache接入,还有数据库链接等现阶段支持MySQL,MongoDB, PostgerSQL还有SQLite).
Perfect在server端是怎样运作的?我们先来看看。
从上面的图能够看出,这和我们的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/username/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模版上创建。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
项目里面就包括了一个Handler和一个相应的mustache模版。但这个时候还是不能执行的,你必须把PerfectLib/MySQL Connector引用进来。例如以下图,这里须要注意PerfectLib是引用PerfectLibOSX版本号。
完毕加入这两个库后还须要配置Buiding Scheme ,如图,由于你启动须要PerfectServer所以你须要把executable改成PerfectServer.app 。并把Shared项目钩上。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="800" alt="">
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结果了。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="800" alt="">
结果:
好!一个简单的Web API就完毕了,当然这是平平无奇,可是用Swift完毕了server端的开发是感觉不错的事情。
Perfect是一个開始,完毕度也有待提高。可是我相信非常快会有质的飞跃,如即将支持的ORM等。文档不足也是一个非常致命的原因。我相信也会非常快改善。
介绍一个不错的blog(须要佛跳墙) http://code-me-dirty.blogspot.co.uk/2016/02/creating-perfect-swift-server.html ,当然你能够看我的连载。
今天先讲到这里,接下来我会让Perfect在Linux上飞,下篇见
Project Perfect让Swift在server端跑起来-引言(一)的更多相关文章
- Project Perfect让Swift在server端跑起来-Perfect in Visual Studio Code (四)
编者语 : 本系列文章已经被Perfect官方引用了,这样的感觉非常好.感恩!Thx all ! Visual Studio Code是一个轻量级的编辑器,但也功能丰富,通过插件你能够完毕如Cordo ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- TFS 自动同步Server 端文件的批处理命令
TFS 自动同步Server 端文件的批处理命令 目前在我们组的工作中很多时候需要将TFS上Server端的代码自动无人值守的同步到本地中来, 找到了一些解决方案的资料http://bbs.scmro ...
- 在 Server 端存取 Excel 檔案的利器:NPOI Library
转处 http://msdn.microsoft.com/zh-tw/ee818993.aspx Codeplex 軟體套件(Package)資訊 套件名稱 NPOI 作者 tonyqus, huse ...
- Unity3d Web Player 与server端联网配置
针对Unity3d Web Player 的server端联网配置写一随笔咯. 以SmartFoxServer2X官方的Unity3d Example ”tris“为例,部署好服务器之后,在Unit ...
- 图解server端网络架构
这篇是计算机类的优质首发推荐>>>><图解server端网络架构> 467张图表讲透构建高可用高性能server实战 写给网络架构师 serverproject师的 ...
- Unity3d Web Player 的server端联网配置
新游戏出了第一个能跑完流程的版本,不得不佩服Unity3D强大的功力,PC.MAC OS.Linux.IOS.Android.web player,前天刚发布的unity3d 4.2版本还支持WIND ...
- Base64实现android端图片上传到server端
首先要下载Base64.java文件http://iharder.sourceforge.net/current/java/base64/ 将代码复制到project中. 然后上代码: android ...
- dubbo框架的web端(war)和server端(tar.gz)结合jenkins打包方式
一.web端程序,打包成war包 jenkins配置 1.项目名称,旧文件处理配置 2.参数构建配置 3.源码库配置 4.打包文件pom.xml配置及多环境打包传参,此处传参qa(表示打测试环境包,名 ...
随机推荐
- 启用adb wifi无线调试功能(无需root)
1 工具 电脑.手机 2 前提 电脑和手机出于同一网段 3 步骤 以管理员方式打开cmd,运行 adb tcpip 5555(执行tcpip调试模式) adb connect 192.168. ...
- 没搞错吧,我只是个web前端工程师,不是manager,也不是leader...
那个时候,我只想好好的学习web前端技术,恨不得把有限的时间和精力都放在提升技术上. 然而,让自己在坑里茁壮成长,要先适应坑内的环境. 首当其冲我们要弄明白的事情有: 团队成员的技术能力和状态 Lea ...
- Windows提高_1.1内核对象
内核对象 什么是内核对象? 内核对象本质上是一个结构体,我们不能直接的操作一个内核对象,需要通过操作系统提供的一系列函数和我们使用的内核对象句柄对它进行一系列的修改. 如何操作内核对象? 创建一个内核 ...
- sort 及lambda表达式定制排序
void CDrawCircle::OnBnClickedBtnSelectinfo() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); BeginEditor ...
- Mybatis学习总结四(关联查询)
一.一对一查询 实例:查询所有订单信息,关联查询下单用户信息. Method1:使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息. public class Order ...
- JAVA I/O之文件复制
有没有大佬告诉我这个不要了的代码插入区(就现在这句话的区域)怎么删掉....... //一个字节一个字节的复制 public static void fun() throws IOException ...
- 由杭州开往成都的K529次列车
春运期间,在由杭州开往成都的K529次列车上,旅客严重超员.一个靠窗坐着的老大爷正跟邻座的人分享他的幸运经历,原来,他是到上饶的,买的是无座票,上车后抱着侥幸心理事先占了个好座,没想到直到开车也没人上 ...
- React和Jquery比较
Jquery的工作方式: 假如你需要给一个按扭添加一个点击事件. 首先根据CSS规则找到对应的dom元素,挂上一个匿名事件处理函数,在事件处理函数中,选中那个需要被修改的DOM元素,读取他的文本值,加 ...
- 洛谷月赛2018.8 T1题解(U28036 Nagisa loves Tomoya)
[题解] 我们设原来的数组为a1,a2,a3..., 那么一次操作之后的数组变为a1+a2,a2+a3,a3+a4..., 两次操作之后数组变为a1+2a2+a3,a2+2a3+a4,a3+2a4+a ...
- layui laypage 当前页刷新问题
困扰了好几天的问题,终于找到答案了 在执行完代码后添加下面的代码实现当前页的刷新 $(".layui-laypage-btn").click(); 在解决问题的过程中,其实已经注意 ...