• Swift写服务端 — Perfect框架学习(一)一、Perfect简介Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS和macOS (OS X)上使用。该软件体系为Swift工程师量身定制了一整套用于...

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

    一、Perfect简介

    Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS和macOS (OS X)上使用。该软件体系为Swift工程师量身定制了一整套用于开发轻量、易维护、规模可扩展的Web应用及其它REST服务的解决方案,这样Swift工程师就可以实现同时在服务器和客户端上采用同一种语言开发软件项目。

    由于建立在一个高性能异步网络引擎基础上,Perfect还能够在FastCGI上运行,支持安全套接字加密(SSL)。该软件体系还包含很多其它互联网服务器所需要的特点,包括WebSockets和iOS消息推送,而且很快会有更多强大的功能支持。


    无论您是资深程序员还是入门级的软件工程师,本文都能够帮助您快速启动Perfect实现服务器项目开发运行。

    二、Perfect项目快速上手

    1.编译入门项目

    我们在Perfect官网的git上直接下载一个入门项目。编译后就可以启动一个本地的服务,监听你的8181端口:

    git clone https://github.com/PerfectlySoft/PerfectTemplate.git
    cd PerfectTemplate
    swift build
    .build/debug/PerfectTemplate



    我们可以在控制台看到以下内容:

    Starting HTTP server on 0.0.0.0:8181 with document root ./webroot

    服务器现在已经运行并等待连接。从浏览器打开http://localhost:8181/ 可以看到欢迎信息。


     在终端控制台中输入组合键“control-c”可以随时终止服务器运行。


    2.Xcode管理

    Swift软件包管理器(SPM)能够创建一个Xcode项目,并且能够运行PerfectTemplate模板服务器,还能为您的项目提供完全的源代码编辑和调试。在您的终端命令行内输入:

    swift package generate-xcodeproj

    然后打开产生的文件“PerfectTemplate.xcodeproj”,确定选择了可执行的目标文件,并选择在“我的Mac”运行。现在您可以运行并调试服务器了。



    直接运行XCode,然后在浏览器中输入0.0.0.0:8181也是能直接运行的!

    三、搭建HTTP服务器

    编辑main.swift文件

    import PerfectLib
    import PerfectHTTP
    import PerfectHTTPServer
    
    //HTTP服务
    var routesArr = [Dictionary<String, Any>]()
    
    var someDict1 : [String:String] = ["method":"GET","url":"/api"]
    
    routesArr.append(someDict1)
    
    let networkServer = NetworkServerManager(root: "webroot", port: 8080, routesArr: routesArr)
    
    networkServer.startServer()
    创建NetworkServerManager.swift文件

    //
    //  NetworkServerManager.swift
    //  PerfectTemplatePackageDescription
    //
    //  Created by ZFJ on 2018/1/9.
    //
    
    import PerfectLib
    import PerfectHTTP
    import PerfectHTTPServer
    
    open class NetworkServerManager {
        fileprivate var server: HTTPServer
        internal init(root: String, port: UInt16, routesArr: Array<Dictionary<String, Any>>) {
            server = HTTPServer.init()                             //创建HTTPServer服务器
            for dict: Dictionary in routesArr {
                let baseUri : String = dict["url"] as! String      //跟地址
                let method : String = dict["method"] as! String    //方法
                var routes = Routes.init(baseUri: baseUri)         //创建路由器
                let httpMethod = HTTPMethod.from(string: method)
                configure(routes: &routes, method: httpMethod)     //注册路由
                server.addRoutes(routes)                           //路由添加进服务
            }
            server.serverName = "localhost"                        //服务器名称
            server.serverPort = port                               //端口
            server.documentRoot = root                             //根目录
            server.setResponseFilters([(Filter404(), .high)])      //404过滤
        }
        
        //MARK: 开启服务
        open func startServer() {
            do {
                print("启动HTTP服务器")
                try server.start()
            } catch PerfectError.networkError(let err, let msg) {
                print("网络出现错误:\(err) \(msg)")
            } catch {
                print("网络未知错误")
            }
            
        }
        
        //MARK: 注册路由
        fileprivate func configure(routes: inout Routes,method: HTTPMethod) {
            routes.add(method: .get, uri: "/selectUserInfor") { (request, response) in
                let path = request.path
                print(path)
                let jsonDic = ["hello": "world"]
                let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: jsonDic)
                response.setBody(string: jsonString)                           //响应体
                response.completed()                                           //响应
            }
            
    //        if method == .get{
    //            //get请求
    //        }else if method == .post{
    //            //post请求
    //            let postParams = request.postParams
    //            print(postParams)
    //        }
        }
        
        //MARK: 通用响应格式
        func baseResponseBodyJSONData(code: Int, message: String, data: Any!) -> String {
            var result = Dictionary<String, Any>()
            result.updateValue(code, forKey: "code")
            result.updateValue(message, forKey: "message")
            if (data != nil) {
                result.updateValue(data, forKey: "data")
            }else{
                result.updateValue("", forKey: "data")
            }
            guard let jsonString = try? result.jsonEncodedString() else {
                return ""
            }
            return jsonString
        }
        
        //MARK: 404过滤
        struct Filter404: HTTPResponseFilter {
            func filterBody(response: HTTPResponse, callback: (HTTPResponseFilterResult) -> ()) {
                callback(.continue)
            }
            func filterHeaders(response: HTTPResponse, callback: (HTTPResponseFilterResult) -> ()) {
                if case .notFound = response.status {
                    response.setBody(string: "404 文件\(response.request.path)不存在。")
                    response.setHeader(.contentLength, value: "\(response.bodyBytes.count)")
                    callback(.done)
                } else {
                    callback(.continue)
                }
            }
            
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    运行结果




    接口访问


    四、搭建MySql服务器

    我的电脑上安装的有Homebrew,所以我直接通过Homebrew安装MySql,安装命令:

    brew install mysql

    配置MySql

    #开启MySQL服务
    mysql.server start
    #初始化MySQL配置向导
    mysql_secure_installation
    我电脑上数据库已经而配置好了,这里面我就不演示了,如果有不了解的可以加我QQ或者QQ群;


    五、安装Navicat Premium

    Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 资料库,让管理不同类型的资料库更加的方便。


    Navicat Premium_12.0.22破解版下载


    这里面下载好了以后会让你输入安装密码,密码为:xclient.info 

    如下图:


    安装成功以后如果打开出现如下图的错误,只需要在终端输入以下代码就好;


    执行以下命令开启
    sudo spctl --master-disable


    这样就可以打开了,然后链接MySQL数据库,如下图


    然后创建数据库userInforsTable,然后创建了一个userTable表,并向userTable表中添加了三条数据;如下图:


    这样你就可以操作MySQL数据库了,当然你也可以通过终端直接操作数据库;


    六、编辑Perfect服务端

    创建DataBaseManager.swift数据库管理类,在这里我们对数据库进行增删改查操作;

    //
    //  DataBaseManager.swift
    //  PerfectTemplatePackageDescription
    //
    //  Created by ZFJ on 2018/1/17.
    //
    
    import MySQL
    
    //MARK: 数据库信息
    let mysql_host = "127.0.0.1"
    let mysql_user = "root"
    let mysql_password = "12345678"
    let mysql_database = "userInforsTable"
    
    //MARK: 表信息
    let userTable = "userTable"                    //用户信息表
    
    open class DataBaseManager {
        fileprivate var mysql : MySQL
        internal init() {
            mysql = MySQL.init()                       //创建MySQL对象
            guard connectDataBase() else{            //开启MySQL连接
                return
            }
        }
        
        //MARK:开启链接
        private func connectDataBase() -> Bool{
            let connected = mysql.connect(host: mysql_host, user: mysql_user, password: mysql_password, db: mysql_database)
            guard connected else{
                print("MySql链接失败" + mysql.errorMessage())
                return false
            }
            print("MySql链接成功")
            return true
        }
        
        //MARK: 执行SQL语句
        /// 执行SQL语句
        ///
        /// - Parameter sql: sql语句
        /// - Returns: 返回元组(success:是否成功 result:结果)
        @discardableResult
        func mysqlStatement(_ sql:String) -> (success:Bool,mysqlResult:MySQL.Results?,errorMsg:String) {
            guard mysql.selectDatabase(named:mysql_database) else {
                //指定操作的数据库
                let msg = "未找到\(mysql_database)数据库"
                print(msg)
                return(false, nil, msg)
            }
            
            let successQuery = mysql.query(statement:sql) //sql语句
            guard successQuery else{
                let msg = "SQL失败:\(sql)"
                print(msg)
                return(false, nil, msg)
            }
            let msg = "SQL成功:\(sql)"
            print(msg)
            return (true, mysql.storeResults(), msg)                            //sql执行成功
        }
        
        /// 增
        ///
        /// - Parameters:
        ///   - tableName: 表
        ///   - keyValueDict: 键:值 对字典
        func insertDataBaseSQL(tableName:String, keyValueDict:Dictionary<String, Any>) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
            var keys: [String] = []
            var values: [String] = []
            for (key, value) in keyValueDict {
                if let str = value as? String {
                    keys.append(key)
                    values.append(str)
                }
            }
            let fieldNameAll: String = keys.joined(separator: ",")
            let valueAll: String = values.joined(separator: ",")
            let SQL = "insert into \(tableName)(\(fieldNameAll)) values(\(valueAll))"
            return mysqlStatement(SQL)
        }
        
        /// 删
        ///
        /// - Parameters:
        ///   - tableName: 表
        ///   - key: 键
        ///   - value: 值
        func deleteDatabaseSQL(tableName: String, key: String, value: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
            
            let SQL = "DELETE FROM \(tableName) WHERE \(key) = '\(value)'"
            return mysqlStatement(SQL)
            
        }
        
        /// 改
        ///
        /// - Parameters:
        ///   - tableName: 表
        ///   - keyValue: 键值对( 键='值', 键='值', 键='值' )
        ///   - whereKey: 查找key
        ///   - whereValue: 查找value
        func updateDatabaseSQL(tableName: String, keyValue: String, whereKey: String, whereValue: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
            
            let SQL = "UPDATE \(tableName) SET \(keyValue) WHERE \(whereKey) = '\(whereValue)'"
            return mysqlStatement(SQL)
            
        }
        
        /// 查所有
        ///
        /// - Parameters:
        ///   - tableName: 表
        ///   - key: 键
        func selectAllDatabaseSQL(tableName: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
            
            let SQL = "SELECT * FROM \(tableName)"
            return mysqlStatement(SQL)
            
        }
        
        /// 查
        ///
        /// - Parameters:
        ///   - tableName: 表
        ///   - keyValue: 键值对
        func selectAllDataBaseSQLwhere(tableName: String, keyValue: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
            
            let SQL = "SELECT * FROM \(tableName) WHERE \(keyValue)"
            return mysqlStatement(SQL)
            
        }
        
        //获取表中所有数据
        func mysqlGetHomeDataResult() -> [Dictionary<String, String>]? {
            let result = selectAllDatabaseSQL(tableName: userTable)
            var resultArray = [Dictionary<String, String>]()
            var dic = [String:String]()
            result.mysqlResult?.forEachRow(callback: { (row) in
                dic["userid"] = row[0]
                dic["userNumber"] = row[1]
                dic["userName"] = row[2]
                dic["userSex"] = row[3]
                dic["userBirthday"] = row[4]
                resultArray.append(dic)
            })
            return resultArray
            
        }
    }
    

    然后在NetworkServerManager中调用DataBaseManager,注册子路由/selectUserInfor查询用户表里的所以信息;

        //MARK: 注册路由
        fileprivate func configure(routes: inout Routes,method: HTTPMethod) {
            routes.add(method: .get, uri: "/selectUserInfor") { (request, response) in
                let path = request.path
                print(path)
    //            let jsonDic = ["hello": "world"]
    //            let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: jsonDic)
    //            response.setBody(string: jsonString)                           //响应体
    //            response.completed()                                           //响应
                let queryParams = request.queryParams
                if queryParams.count == 0{
                    let result = DataBaseManager().mysqlGetHomeDataResult()
                    let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: result)
                    response.setBody(string: jsonString)
                    response.completed()
                }else{
                    //有参数
                    //let value : String
                    for i in 0...queryParams.count - 1{
                        let partArr = queryParams[i]
                        print(partArr)
                    }
                    let jsonString = self.baseResponseBodyJSONData(code: 200, message: "成功", data: nil)
                    response.setBody(string: jsonString)
                    response.completed()
                }
            }
        }
        
    然后调取接口访问数据http://0.0.0.0:8080/api/selectUserInfor;如下图:


    注意事项

    1.如果你在NetworkServerManager中无法调用DataBaseManager,或者说调用DataBaseManager查找不到,那是因为你创建DataBaseManager的时候没有选择在项目中引用,默认选择了第一个第三方库了;


    如果你创建完成只需要稍微修改一下就好;


    2.如果提示MySQL找不到,那是因为你的工程中,或者我们开始下载的那个示例工程没有导入MySQL,你需要引用一下就好;

    首先修改Package.swift文件,引用https://github.com/PerfectlySoft/Perfect-MySQL.git 

    示例如下:

    import PackageDescription
    
    let package = Package(
        name: "PerfectTemplate",
        targets: [],
        dependencies: [
            .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 3),
            .Package(url: "https://github.com/PerfectlySoft/Perfect-MySQL.git", majorVersion: 2),
        ]
    )
    然后删除PerfectTemplate.xcodeproj文件, 接着终端重新生成PerfectTemplate.xcodeproj文件,最后打开工程就会发现MySQL库了,如下图:


    DEMO下载

    结束语

    欢迎大家加移动开发技术交流群,在这里大家可以一起讨论学习,这里有大佬,也有小菜鸟,没事还能斗斗图装装逼,如果需要换工作的还能相互推荐,期待大家的加入!大笑偷笑


                                                                 

                    












    展开全文
  • 准备材料 ...Swift 官网 Perfect 官网 Perfect GitHub 仓库 搭建 Ubuntu 16.0.4 虚拟机服务器环境 (多图预警) ① 在 VM 中新建虚拟机 ...

    准备材料

    1. Ubuntu 16.0.4 or 16.10 镜像 (本文中使用的是 Ubuntu 16.0.4 版本)
    2. Swift 官网
    3. Perfect 官网
    4. Perfect GitHub 仓库

    搭建 Ubuntu 16.0.4 虚拟机服务器环境 (多图预警)

    ① 在 VM 中新建虚拟机



















    接下来可以一路点击下一步直到完成.

    —– 静静等待 安装完成 ——

    安装完成后大概这样



    ② 修改 Ubuntu 默认语言为中文简体























    重启 Ubuntu



    重启成功后登录到桌面,会出现提示,文章这里选择 -> 保留旧的名称



    这时候系统已经成功变成中文简体了



    下一步: 一步一步搭建 Perfect Swift Server 服务器 (二)

    展开全文
  • 链接: 一步一步搭建 Perfect Swift Server 服务器 (一) 准备材料 Ubuntu 16.0.4 or 16.10 镜像 (本文中使用的是 Ubuntu 16.0.4 版本) Swift 官网 Perfect 官网 Perfect GitHub 仓库 Ubuntu 安装 git $sudo ...

    链接: 一步一步搭建 Perfect Swift Server 服务器 (一)

    准备材料

    1. Ubuntu 16.0.4 or 16.10 镜像 (本文中使用的是 Ubuntu 16.0.4 版本)
    2. Swift 官网
    3. Perfect 官网
    4. Perfect GitHub 仓库

    Ubuntu 安装 git

    $sudo apt install git

    Ubuntu 安装 Perfect + Swift

    最快捷安装方式,使用官方提供的 Perfect-Ubuntu 自动安装脚本

    打开 Ubuntu 终端
    $git clone https://github.com/PerfectlySoft/Perfect-Ubuntu.git

    进入 clone 成功的文件夹内,打开 install.sh 文件
    修改 SWIFT_VERSION=4.1.2SWIFT_VERSION=4.1.3

    保存修改,继续执行脚本

    cd Perfect-Ubuntu/
    chmod +x ./install.sh
    sudo ./install.sh --sure

    脚本会下载 Swift4.1.3 安装包,等待执行完成。
    查看 swift 安装是否成功并查看版本
    $swift --version

    至此,Perfect + Swift 开发环境安装完成

    展开全文
  • let Perfect like more Rails
    编者语:努力会有回报,加油吧!

           关于Perfect,已经从开发工具,原理,运行环境做了介绍。今天开始进入架构。其实,Perfect更像Java Servlet,我很喜欢Rails这种方式去构建。说句真心话,对于我这种.NET程序员,更希望只是换种语言,毕竟现在ASP.NET Core 很Cool。好!让大家看看我对Perfect的改造。

           再说说Perfect的运行原理。其实当用户发送请求时,都是首先找到PerfectServerModuleInit()这个方法,根据指定规则去找对应的Handlers,之后通过Handlers的方法handleRequest去处理相对应的事务处理。我们把这个流程用图的方式表示一下。
           
           其实handleRequest很接近我们的Controller,如果做成一个类似Rails的框架不是不可能的。这里我参考了在Github上的一个项目(https://github.com/groovelab/SwiftBBS)大家也可以去看看。

           首先我要扩展一下PerfectLib中的WebRequest和WebResponse这两个方法,针对WebRequest增加了action和参数,由于用到Rails思想,所以action是不能缺少的,后面的参数也是。而WebRepsonse把页面渲染和数据JSON输出做成统一的方法。这样做的好处就是减少了每个Handler一堆重复的工作.对应的文件是extension.swift

    //
    //  extension.swift
    //  MVCDemo
    //
    //  Created by 卢建晖 on 16/2/27.
    //  Copyright © 2016年 Kinfey. All rights reserved.
    //
    
    import PerfectLib
    
    extension WebRequest {
        var action: String {
            return urlVariables["action"] ?? "index"
        }
        var acceptJson: Bool {
            return httpAccept().contains("application/json")
        }
    }
    
    extension WebResponse {
        func render(templatePath: String, values: MustacheEvaluationContext.MapType) throws -> String {
            let fullPath =  templatePath
            let file = File(fullPath)
            
            try file.openRead()
            defer { file.close() }
            let bytes = try file.readSomeBytes(file.size())
            
            let parser = MustacheParser()
            let str = UTF8Encoding.encode(bytes)
            let template = try parser.parse(str)
            
            let context = MustacheEvaluationContext(map: values)
            context.filePath = file.path()
            let collector = MustacheEvaluationOutputCollector()
            try template.evaluatePragmas(context, collector: collector, requireHandler: false)
            template.evaluate(context, collector: collector)
            return collector.asString()
        }
        
        func renderHTML(templatePath: String, values: MustacheEvaluationContext.MapType) throws {
            let responsBody = try render(templatePath, values: values)
            appendBodyString(responsBody)
            addHeader("Content-type", value: "text/html")
        }
        
        func outputJson(values: [String:JSONValue]) throws {
            addHeader("content-type", value: "application/json")
            let encoded = try values.jsonEncodedString()
            appendBodyString(encoded)
        }
    }
    
           接下来我们做一个Controller.swift的基类,这个基类继承自RequesHandler包括了每个action所返回的结果。我这里参照.NET Core 把返回结果封装成IActionResult.并把handlerRequest做成一个统一处理的方法。
    //
    //  Controller.swift
    //  MVCDemo
    //
    //  Created by 卢建晖 on 16/2/26.
    //  Copyright © 2016年 Kinfey. All rights reserved.
    //
    
    import PerfectLib
    
    class Controller : RequestHandler{
        
        
        enum IActionResult {
            case View(templatePath: String?, values: [String: Any])
            case Redirect(url: String)
            case Error(status: Int, message: String)
        }
        
        
        var request: WebRequest!
        var response: WebResponse!
        
        
        func handleRequest(request: WebRequest, response: WebResponse) {
            self.request = request
            self.response = response
            
            
            
            defer {
                response.requestCompletedCallback()
            }
            
            do{
            
            switch try Action(request.action) {
            case let .View(templatePath, responseValues):
                let values = responseValues
                if request.acceptJson {
                    try response.outputJson(values)
                } else if let templatePath = templatePath {
                    try response.renderHTML(templatePath, values: values)
                }
            case let .Redirect(url):
                response.redirectTo(url)
            case let .Error(status, message):
                response.setStatus(status, message: message)
                break;
            }
            }catch let e {
                print(e)
            }
        }
        
        func Action(action: String) throws -> IActionResult {
            return .Error(status: 500, message: "need implement")
        }
        
    }
    
           为何要这样做,这里有一个方法Action,根据URL Routing去找到对应的Action方法,之后通过handlerRequest处理返回对应的页面或者JSON数据,我们做一个HomeController.swift看看。
    import PerfectLib
    
    class HomeController: Controller {
        
        override func Action(action: String) throws -> IActionResult {
            
            switch request.action {
            case "about" :
                return try About()
            default:
                return try Index()
            }
            
        }
        
        func Index() throws -> IActionResult{
            
            var values = [String: Any]()
            
            values["str"]="Hello Swift MVC Framework"
            
            return .View(templatePath: "Index.mustache", values: values)
        }
        
        func About() throws -> IActionResult{
            
            var values = [String: Any]()
            
            values["str"]="Hello Swift MVC Framework"
            
            return .View(templatePath: "About.mustache", values: values)
        }
        
        
    }
          这里就是我们改造后的HomeController,而对应的URL Routing我参照.NET Core的方式放在Startup.swift上
    import PerfectLib
    
    public func PerfectServerModuleInit() {
        
        Routing.Handler.registerGlobally();
        Routing.Routes["GET", ["/","/Home/{action}"] ] = { _ in return HomeController() }
        
        
    }
          最后我们把页面加上 index.mustache
    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<title>Swift MVC</title>
    </head>
    <body>
    <h1>{{str}}</h1>
    </body>
    </html>

         about.mustache

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <title>About</title>
    </head>
    <body>
    <h1>This is Kinfey design</h1>
    </body>
    </html>
        基本上就可以完成我们的Rails改造了,看看在Xcode的结构,很Rails,很.NET Core吧
        
        看看运行的过程,如图
        
        我们运行下
           

        
        这里补充一点,如果你要把页面模版在Xcode中使用必须要对Build Phase进行设置,在Copy Files中添加,需要设置Desination为Product Directory,如图
        
         今天说到这里,祝周末愉快!


           
           

    展开全文
  • PerfectSwift 语言服务器端软件框架 Perfect 开源项目 参与 Perfect 开发 Slack 在线协同 PerfectSwift 语言服务器端软件框架 Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS...
        

    Perfect:Swift 语言服务器端软件框架

    perfect_github_2_0_0.jpg
    Perfect 开源项目 参与 Perfect 开发 Slack 在线协同

    Perfect:Swift 语言服务器端软件框架

    Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS和macOS (OS X)上使用。该软件体系为Swift工程师量身定制了一整套用于开发轻量、易维护、规模可扩展的Web应用及其它REST服务的解决方案,这样Swift工程师就可以实现同时在服务器和客户端上采用同一种语言开发软件项目。

    Perfect内建整套工具集,因为无论是客户端还是服务器都能够在此基础之上用同一种计算机语言Swift进行程序开发,因此能够为软件工程师大幅提高工作效率。在全球目前众多的服务器端框架体系和工具箱产品之中,Perfect目前已经成为许多iTunes在线应用程序的可靠后台应用。

    无论您是资深程序员还是入门级的软件工程师,本文都能够帮助您快速启动Perfect实现服务器项目开发运行。

    使用Perfect

    Swift语言兼容性

    目前本项目主干版本基于Xcode 8 GM release发行版本。

    Current version: DEVELOPMENT-SNAPSHOT-2016-09-05-a, or Xcode 8 GM release

    快速上手

    在线教程(简体中文) 能够帮助您快速开始使用Perfect。该指南包括了如何使用Perfect的几个典型例子。

    文档

    Perfect帮助文档(简体中文) 如何部署应用程序、如何查找详细文档和帮助。

    我们欢迎所有贡献以及对Perfect文档提高的宝贵意见。我们欢迎您为Perfect付出宝贵的支持。如果您发现了任何文字或者内容有错误,或者有任何建议,请提交一个代码上传请求,或在JIRA上报告问题.

    社区

    我们总会需要您的帮助。如果您真的有想法,不妨加入我们的Perfect支持社区:

    Slack | Twitter

    部署

    目前,部署Perfect的方式可以选择DockerHeroku。我们强烈推荐使用这种方式进行部署,因为这些部署方式是通过最新Swift 3.0 和 Perfect 2.0编译完成的。

    教程和案例

    我们的图书馆一直在随着社区成员的加入而不断增长,Swift-Perfect开发社区有许多源程序共分享,都是建立在Perfect程序框架之上。典型例子包括:

    更多例子敬请关注!

    Perfect 1.0教程 (支持 Swift 2.2) 由Swift-Perfect社区成员贡献。或者从Perfect 2.0开始 (支持 Swift 3.0).

    核心 Perfect 模块

    Perfect 项目由若干代码资源库构成,便于您按需查找、下载和安装必要的组件:

    • Perfect:核心的程序库和基础软件框架

    • Perfect Docs:所有必要的程序文档和帮助内容

    参考和样例

    • Perfect 模板:一个使用SPM软件包管理器快速上手的入门项目,能够编译为一个独立运行的HTTP服务器。该代码资源非常适合基于Perfect的项目就此开始开发过程。

    • Perfect 样例:所有Perfect 项目的典型样例

    数据源

    工具集

    更多内容

    Perfect 可以作为一个独立的HTTP服务器HTTPS加密服务器进行运行,或者通过FastCGI快速网关服务器进行运行。简单来说就是提供一个能够在系统启动是加载的Web服务,从而能够将您自行开发的Swift源码模块根据URL路由要求实现请求/响应,或者根据内建的Mustache模板处理页面。

    Perfect是一个完全异步、高性能的网络引擎,并且能够为互联网服务提供大吞吐量控制。该软件体系支持安全套接字(SSL)加密,并且封装了一系列互联网服务器通用的特性,比如WebSocketsiOS消息推送。然而,您的开发可以不必受限于这些选项。

    请根据您自己的喜好使用JSON或者其他的模板系统,等等。

    加入我们的开发社区并贡献自己的力量

    Swift-Perfect开发者社区是改进Perfect产品并实现客户支持的关键。

    在社区里,您可以通过加入Perfect Slack 频道Perfect Gitter 频道互相帮助、分享技术、互相学习和研究诀窍。任何一种贡献方式我们都非常欢迎:问题汇报、文档更新、补丁修复、编写案例、分享项目或者任何编程窍门,我们相信这些都能够极大地帮助我们的Swift-Perfect社区。

    如果您发现了任何文字或者内容有错误,或者有任何建议,请查看我们的Perfect JIRA资源库.

    如果您希望分享一下您的项目、教程或者视频,请将URL共享到我们的推特或者GitHub账号:Perfect 推特。之后我们的Perfect团队会继续推广。

    展开全文
  • Linux create Perfect Project .
  • Perfect in Visual Studio Code
  • PerfectSwift 服务端框架
  • 上节我们介绍了阿里云ECS上部署个Swift Perfect的实例环境的方法,下面我将继续介绍如何实际开发一个简单的服务器接口并与mysql数据库进行交互;三、依托阿里云服务器,搭建一个Perfect+mysql的服务1.运用swift包...
  • swift 开发服务器学习

    2017-04-22 23:21:08
    首先,上官网 https://www.perfect.org 官方文档可是有中文的哦。 然后,GitHub Demo https://github.com/PerfectlySoft/PerfectTemplate开始操作: 下载Demo :git clone ...
  • 我的简单swift爬虫类

    2015-11-12 15:56:44
    //我的爬虫类 import Foundation class LANcrawlerCatchHeadTool {   func LANcrawlerCatchHead( LANstringNeedToCatch:String,headtext:String,endText:String)->NSMutabl
  • Swift写服务端 — Perfect框架学习(一)
  • 二、Swift perfect环境搭建1.打开Mac电脑的终端在做上角找到Shell- &gt;新建远程连接,点击+添加从阿里云获得的公网IP地址;点击连接,并输入阿里云服务器的登录密码(是登录密码,不是远程连接密码)就会进入到...
  • 在安装了 Xcode 8 之后会有 Swift 的编译器了,这里我们的环境是 mac OS, 所以 Linux 环境要自己去安装 Swift 相关的环境,通过命令可以查看 Swift 的版本: swift swift 3.0 之后默认是安装了 Swift Package Mana.....
  • perfect中文教程 http://perfect.org/docs/index_zh_CN.html 一、打开终端: 1、新建一个SwiftPerfectDemo文件夹用于保存项目文件: mkdir SwiftPerfectDemo cd SwiftPerfectDemo 2、初始化git: git init...
  • 1.手动创建 Perfect 项目 mkdir myPerfect cd myPerfect swift package init --type executable swift package generate-xcodeproj 2.进入文件夹打开Package.swift, 编辑Package.swift添加依赖库 import ...
  • Perfect支持WebSockets
  • http://perfect.org/docs/gettingStarted_zh_CN.html
  • 上节我们介绍了如何在本地运行一个Perfect与mysql交互的简单服务端接口程序,下面就是将这个程序部署到ECS上的方法。1.在服务器上安装mysqlUbuntu上安装MySQL非常简单只需要几条命令就可以完成。1. sudo apt-get ...
  • 该软件体系为Swift工程师量身定制了一整套用于开发轻量、易维护、规模可扩展的Web应用及其它REST服务的解决方案,这样Swift工程师就可以实现同时在服务器和客户端上采用同一种语言开发软件项目。由于建立在一个高...
1 2 3 4 5 ... 20
收藏数 984
精华内容 393
热门标签
关键字:

perfect swift