用Swift的框架Vapor写服务端初体验

总而言之就是用Swift写服务端接口

安装Vapor

curl -sL toolbox.vapor.sh | bash

创建项目

vapor new Hello --template=light

--template=light 意思是使用light-template模板,如果不指定模板的话默认使用base-template模板

下载依赖并编译项目

vapor build

50多M的包,好久...

配置服务器

创建Config文件夹,新建servers.json文件, 指定host地址和端口号

{
  "http": {
    "host": "0.0.0.0",
    "port": 8000
  }
}

0.0.0.0 和 127.0.0.1 都表示本机,使用 0.0.0.0 的原因是,一个机器可能有多个 IP 地址,0.0.0.0 表示监听每个 IP 8000 端口收到的请求。

127.0.0.1 则表示只接受本机发给本机的请求,从网络上其他电脑发过来的请求,不论是请求的哪个 IP,都是不被处理的。

打包成一个XCode项目

vapor xcode -y 这样子打包之后就会自动打开了

启动服务器

vapor run 或者在XCodey运行

用Swift的框架Vapor写服务端初体验_第1张图片

看到了控制台输出了

No command supplied, defaulting to serve...
No preparations.
Server 'http' starting at 0.0.0.0:8000

就可以了

如果说什么Can not bind to xxxx 就应该是端口占用的问题,可以用lsof -i tcp:端口号kill -9 进程号解决这个问题

如果你在浏览器输入http://localhost:8000可以看到以下信息就证明服务器启动成功了

Request  
- GET / HTTP/1.1
- Headers:
    Host: 0.0.0.0:8000
    Upgrade-Insecure-Requests: 1
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36
    Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2
    Accept-Encoding: gzip, deflate, sdch
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- Body:

会出现这串东西是因为他执行了Sources/App/main.swift的内容,把请求体返回回来.

修改Sources/App/main.swift

把文件改成这样子

import Vapor

let drop = Droplet()

drop.get { _ in
    return try JSON(node: [
            "message":"Hello Vapor"
        ])
}

drop.get("Hello","There") { request in
    return try JSON (node:[
            "message":"Hello There"
        ])
}

drop.get("TEST") { request in
    return try JSON (node:[
            "message":"Hello Test"
        ])
}

drop.run()

然后我们使用Postman测试一下三个地址
http://localhost:8000/

http://localhost:8000/Hello/There

http://localhost:8000/TEST

接下来试试接受参数并返回

继续在drop.run() 上面补充

drop.post("post") { request in
    guard let name = request.data["name"]?.string else {
        throw Abort.badRequest
    }
    return try JSON(node: [
        "name": "Hello \(name)!"
        ])
}

guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。

判断如果没有接收到'name'参数的话就会抛出异常Invalid request,有的话就返回Hello + 参数值 + !

测试一下

为什么要用Swift写服务器?

额,看了一下资料,也没发现有谁说这东西有什么特别突出的优点,不过没试过,觉得挺新鲜,就试试嘛.

学习资料 :
服务端 Swift - Vapor 篇 (一)
用 Swift 的框架 Vapor 写服务器这事儿怎么样?

你可能感兴趣的:(用Swift的框架Vapor写服务端初体验)