使用Swift4+Vapor写后端-初体验

使用Swift4+Vapor写后端-初体验,第1张

Vapor 是一个基于纯 Swift 构建出的 Web 开发框架,目前可以运行在 macOS 和 Ubuntu ,用于构建出漂亮易用的网站或者 API 服务。

Vapor的官网做的很漂亮,文档也比较完整,是一款比较主流、优雅、更新活跃的框架,非常适合初学者。

安装 官方文档 安装步骤即可。

vapor的文件结构类似于其他Web框架。

项目主体目录层级

编译之前需要拉取项目所有的依赖包,Vapor使用Swift Package Manager 来管理包,使用 vapor fetch 命令进行拉取依赖,拉取到本地后后所有的包源码将会在 Packages 目录中,如下:

这类似于iOS中使用 cocoapods 管理依赖包时的 pod install 。

使用 vapor build 或者 vapor build --release 编译项目

使用 vapor run serve 运行项目。

这时就可以通过在浏览器中输入 localhost:8080/plaintext 或者运行 curl localhost:8080/plaintext 来请求模板中的示例请求。

cd进入项目目录下,我们可以使用 vapor xcode 命令生成Xcode项目,然后就可以直接使用 Xcode进行web开发了,这对于iOS开发者是那么的熟悉。用Xcode打开项目,选择 Run scheme来运行。

vapor模板中 Routes.swift 中已经有了几个示例,例如:

我们运行起来项目后,直接在浏览器里输入“0.0.0.0:8080/hello”这个get请求,就会返回响应的json数据

vapor初步了解,感觉很不错的样子。现在我们已经了解了vapor的基本操作,下一步我们学习一下使用Heroku部署服务器。 Heroku 为个人用户提供了一个免费沙盒(512 MB RAM │ 1 web/1 worker),我们可以使用它免费去部署一个属于自己的服务器。访问速度是有点慢,毕竟国外免费。新开的坑,希望接下来能够慢慢填。

简单来说swift是开发苹果iOS的最快捷的计算机语言。

但是实际上swift已经可以进行一次性编译之后,同时实现在苹果iOS和安卓系统上的部署。能够实现这个功能的目前唯一的IDE是SCADE,一个德国的软件产品(目前处于试用状态)。

而且从2015年起,swift不但支持在手机前端的开发,还支持开发服务器后端的程序,比如使用PerfectlySoft出品的Perfect 2.0就可以确保swift在Linux Ubuntu 16.04上运行并实现一个Web服务器,访问各种数据库并调用远程访问。实际上Perfect 2.0是市面上最快的HTTP服务器,比php和java服务器都快得多。

详细的服务器对比指标请参考这里:

http://gold.xitu.io/entry/57e296af0bd1d000570ee3b4?utm_source=gold-miner&utm_medium=readme&utm_campaign=github

关于swift的中文指南,可以参考这里:https://github.com/ipader/SwiftGuide

关于服务器端的Swift语言使用,可以参考这里:https://github.com/PerfectlySoft/PerfectDocs/blob/master/README.zh_CN.md

在工程中随便创建一个类,选择语言OC,我们会发现工程中会多出来一个SwiftStudy-Bridging-Header.h文件,删除创建的oc类,在这里引入

好了,可以在swift文件使用AFNetworking

platform :ios, '7.0'

pod 'SDWebImage', '~>3.7.1'

pod 'CocoaHTTPServer', '~>2.3'

pod 'RoutingHTTPServer', '~>1.0.0'

pod 'Masonry', '~>0.6.1'

pod 'ASIHTTPRequest', '~>1.8.2'

pod 'MBProgressHUD', '~>0.9.1'

pod 'AFNetworking', '~>2.5.4'

在使用OC进行项目开发时,对AFNetworking做了一层简单的外部封装,今天我们就把它用Swift实现。

使用过新版AFNetworking的都知道它有一个AFHTTPSessionManager,在这里我们继承AFHTTPSessionManager使用单例模式返回一个该类的实例,

来进行网络操作在swift中单例的写法跟OC语法差别很大,Swift语法在这里不多讲解,请参考《The Swift Programming Language》,我们来看下代码

//

// RequestClient.swift

// SwiftStudy

//

// Created by 杨雯德 on 15/8/19.

// Copyright (c) 2015年 杨雯德. All rights reserved.

//

import UIKit

class RequestClient: AFHTTPSessionManager {

class var sharedInstance :RequestClient {

struct Static {

static var onceToken:dispatch_once_t = 0

static var instance:RequestClient? = nil

}

dispatch_once(&Static.onceToken, { () ->Void in

//string填写相应的baseUrl即可

var url:NSURL = NSURL(string: "")!

Static.instance = RequestClient(baseURL: url)

})

//返回本类的一个实例

return Static.instance!

}

}

拿到RequestClient的实例我们就可以进行post、get以及上传图片文件的封装了

在OC中使用AFNetworking习惯使用block来进行数据的传递等,在Swift我们使用闭包来进行数据的传输

这是我的文件目录

SwiftStudy ------------工程目录

AppDelegate.swift

myViewController.swift

ViewController.swift

NetWork ------------网络相关

RequestClient.swift

RequestAPI.swift

CustomVC ------------VC的封装,

CostomNavigationVC.swift

BaseViewController.swift

在这里我们主要拿中国天气网的API测试一个PUT请求,来看下RequestAPI.swift。

typealias Succeed = (NSURLSessionDataTask!,AnyObject!)->Void

typealias Failure = (NSURLSessionDataTask!,NSError!)->Void

class RequestAPI: NSObject {

//普通get网络请求

class func GET(url:String!,body:AnyObject?,succeed:Succeed,failed:Failure) {

var mysucceed:Succeed = succeed

var myfailure:Failure = failed

RequestClient.sharedInstance.GET(url, parameters: body, success: { (task:NSURLSessionDataTask!, responseObject:AnyObject!) ->Void in

mysucceed(task,responseObject)

}) { (task:NSURLSessionDataTask!, error:NSError!) ->Void in

myfailure(task,error)

}

}

Swift的一个好处是我们不用在无用的头文件引入,Objective-C中头文件的引入眼睛都看不下去了,

在OC中经常会用到typedef,用来为一种数据类型定义一个新名字,在Swift中用typealias来现有的类型定义可替代名称,

里我们定义两个funcation,Succeed和Failure,Succeed有两个参数NSURLSessionDataTask和

AnyObject返回为空,分别对应AFNetworking网络请求返回的NSURLSessionDataTask和id,id型数据

正是我们需要的数据,只不过在swift我们使用的是AnyObject,Failure同样如此,然后我们来看看class func GET,在定义方法时我们定义了一下几个参数:

1:url:String! 不解释 码农都懂的

2:body:AnyObject? 传递的postBody体,由于我们不确定开发人员get请求是否需要其他的参数,因此再次设置类型为AnyObject?,这样如果用户不需要直接传nil即可

3:succeed:Succeed 很熟悉有没有,这就是最开始我们定义的funcation,返回数据就靠它的了

4:failed:Failure 看到failed真爱有某有,里面有我们最喜欢的NSError,简直见一次想打一次

接下来看函数内部实现,我们定义两个变量来接收传递过来的函数指针,通过函数指针就可以回传数据拉。Swift与Objective-C最大的不同是使用了.语法,继续往下看

通过RequestClient.sharedInstance 我们可以获得RequestClient的一个实例,这就是swift中单例模式的使用哦,回来在看看RequestClient.swift就明白了,

然后我们就开始真正的网络请求了,调用AFHTTPSessionManager的PUT方法

RequestClient.sharedInstance.GET(url, parameters: body, success: { (task:NSURLSessionDataTask!, responseObject:AnyObject!) in

mysucceed(task,responseObject)

}) { (task:NSURLSessionDataTask!, error:NSError!) in

myfailure(task,error)

}

依次填写对应的参数,我们看下

success: { (task:NSURLSessionDataTask!, responseObject:AnyObject!) ->Void in

mysucceed(task,responseObject)

})

这是一个标准的闭包, (task:NSURLSessionDataTask!, responseObject:AnyObject!) ->Void有没有感觉很熟悉,正是我们最开始定义的Succeed,由此,你又学习

了一招闭包的表达式写法

1

2

3

{ (parameters) ->returnType in

statements

}

关于闭包的具体操作请查看 “http://c.biancheng.net/cpp/html/2285.html"

闭包函数中我们就可以拿到服务器给我们返回的数据了responseObject,在函数开始我们已经接受了外部的函数指针,通过这个函数指针我们把值传递回去即可,

我们来看下我测试类中得代码

override func viewDidLoad() {

super.viewDidLoad()

self.view.backgroundColor = UIColor.brownColor()

var image:UIImage

//Navigationbar 左侧返回按钮自定义,参考文件BaseViewController.swift

self.leftButton(nil, hlIimage: nil, title: "返回", size: CGSize(width: 38, height: 30), action: "buttonClick", target: self)

var dic:Dictionary= ["A":"a","B":"b","C":"c"]

//post测试

RequestAPI.POST("List", body: dic, succeed: succeed, failed:failed)

//get测试

var getUrl:String = "http://m.weather.com.cn/atad/101190101.html"

RequestAPI.GET(getUrl, body: nil, succeed: succeed, failed: failed)

//文件上传

// Do any additional setup after loading the view.

}

func succeed(task:NSURLSessionDataTask!,responseObject:AnyObject!)->Void{

println("oh my god 成功了+\(responseObject)")

}

func failed(task:NSURLSessionDataTask!,error:NSError!)->Void{

println("oh shit 失败了")

}

在ViewController我们通过调用RequestAPI的类方法GET来获取数据,同时我们定义了两个方法succeed和failed,注意看方法中得参数和AFHTTPSessionManager

返回数据的参数是一样的,这样我们的拿到的数据就是服务器给我们返回的全部数据,调用equestAPI的GET方法将讲个函数指针传递过去,网络请求成功之后会通过函数指针将数据返回。

然后我们就可以进行其他的工作了。

使用过新版AFNetworking会经常遇到3084 1011和1016错误,出现这几个错误一般是数据解析错误,更改AFNetworking里面相应的数据类型即可,也可以根据实际情况自己定义。

/**

RequestClient.sharedInstance.requestSerializer = AFJSONRequestSerializer()

RequestClient.sharedInstance.responseSerializer = AFJSONResponseSerializer()

RequestClient.sharedInstance.requestSerializer.setValue("application/json,text/html", forHTTPHeaderField: "Accept")

RequestClient.sharedInstance.requestSerializer.setValue("application/jsoncharset=utf-8", forHTTPHeaderField: "Content-Type")

*/

总结,AFNetworking已经是用的最多的网络的框架,对AFNetworking的进一步的简单外层封装,我们就可以避免网络请求时大量初始化工作,直接使用单例即可,这样提高了

效率,也节省了大量的代码,至少一眼望去自己看的也比较舒服,通过


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/408007.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存