swift编写服务端(Perfect框架)

一、打开终端:

1、新建一个SwiftPerfectDemo文件夹用于保存项目文件:

mkdir SwiftPerfectDemo

cd SwiftPerfectDemo

2、初始化git:

git init 

touch README.html

git add README.html

git commit -m "Initial commit"

3.创建Package.swift文件:

touch Package.swift

4、使用Xcode打开Package.swift文件并添加如下代码,添加所需要使用的软件包:

//软件包管理 import PackageDescription let versions = Version(0,0,0)..<Version(10,0,0) let urls = [ "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", //HTTP服务 "https://github.com/PerfectlySoft/Perfect-MySQL.git", //MySQL服务 "https://github.com/PerfectlySoft/Perfect-Mustache.git" //Mustache ] let package = Package( name: "PerfectDemoProject", targets: [], dependencies: urls.map { .Package(url: $0, versions: versions) } )

5、创建Sources文件夹:

mkdir Sources

echo 'print("Hello")'>>Sources/main.swift

6、编译运行项目

编译:swift build

运行:.build/debug/SwiftPerfectDemo

注意:此处编译如果报错,请查看Xcode路径

xcode-select -p

显示不是为/Applications/Xcode.app/Contents/Developer,则更改:

unset DEVELOPER_DIR

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

7、创建成Xcode可以运行项目:

swift package generate-xcodeproj

二、使用Xcode
1、打开PerfectDemoProject.xcodeproj

注意: 若在编辑过程中无其他问题且无法运行,请删除PerfectDemoProject.xcodeproj文件,重新使用swift package generate-xcodeproj命令创建

三、搭建HTTP服务器

1.编辑main.swift

import PerfectLib import PerfectHTTP import PerfectHTTPServer //HTTP服务 let networkServer = NetworkServerManager(root: "webroot", port: 8888) networkServer.startServer()

2.创建并编辑NetworkServerManager.swift

import PerfectLib import PerfectHTTP import PerfectHTTPServer open class NetworkServerManager { fileprivate var server: HTTPServer internal init(root: String, port: UInt16) { server = HTTPServer.init() //创建HTTPServer服务器 var routes = Routes.init(baseUri: "/api") //创建路由器 configure(routes: &routes) //注册路由 server.addRoutes(routes) //路由添加进服务 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) { // 添加接口,请求方式,路径 routes.add(method: .get, uri: "/") { (request, response) in response.setHeader( .contentType, value: "text/html") //响应头 let jsonDic = ["hello": "world"] let jsonString = self.baseResponseBodyJSONData(status: 200, message: "成功", data: jsonDic) response.setBody(string: jsonString) //响应体 response.completed() //响应 } } //MARK: 通用响应格式 func baseResponseBodyJSONData(status: Int, message: String, data: Any!) -> String { var result = Dictionary<String, Any>() result.updateValue(status, forKey: "status") 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) } } } }

3.运行结果:

控制面板会打印出:启动HTTP服务器;证明OK啦

4.访问接口效果:

浏览器输入:http://0.0.0.0:8888/api/

注:本文参照https://www.jianshu.com/p/2ce98b556e89

猜你喜欢

转载自blog.csdn.net/qq_37191821/article/details/84649608