PTBNetWorkingTool是基于Alamofire 4.3(https://github.com/Alamofire/Alamofire/)封装的网络工具,主要支持数据请求、上传请求和下载请求。
[TOC]
开发者直接调用PTBNetWorkingTool进行网络请求,请求的结果可以通过代理和闭包获取。
网络请求类型通过枚举PTBHTTPMethod获得,支持9种请求类型
public enum PTBHTTPMethod: String {
case options = "OPTIONS"
case get = "GET"
case head = "HEAD"
case post = "POST"
case put = "PUT"
case patch = "PATCH"
case delete = "DELETE"
case trace = "TRACE"
case connect = "CONNECT"
}请求得到的数据可以按5种方式序列化。
public enum PTBResponseType: String {
case none = "NONE" // 直接返回HTTPResponse,未序列化
case data = "DATA" // 序列化为Data
case json = "JSON" // 序列化为JSON
case string = "STRING" // 序列化为String
case any = "ANY" // 序列化为Any
}一、设置基本请求头
func setHttpHeaders(httpHeaders: [String: String])该方法可以设置基本的请求头,之后的请求如果没有传入新的请求头都会在请求头上加上该内容。
二、设置基本URL
func setBaseUrl(baseUrl: String)该方法可以设置基本的url,之后的请求如果允许添加基本设置都会拼接上该baseUrl。
三、设置基本参数
func setBaseParameters(parameters: [String: Any])该方法设置基本的参数,之后的请求如果允许添加基本设置都会拼接上该参数。
四、设置数据序列化方式
func setResponseType(type: PTBResponseType)该方法设置数据的序列化方式,全局影响,如果没有设置默认是JSON类型。
数据请求可以根据url、request两种方式请求。
/// 通过地址进行数据请求 /// /// - Parameters: /// - method: 请求类型,默认POST /// - urlString: 请求地址 /// - parameters: 请求的参数 /// - addBaseSetting: 是否添加基本设置,默认添加 /// - httpHeaders: 请求头,可选,为空则用初始设置的请求头 /// - delegate: 请求完成后的代理,可选 /// - completionHandler: 请求完成的回调,当代理为空时执行该回调
public static func request(method: PTBHTTPMethod = .post, to urlString: String, parameters: [String: Any]?, addBaseSetting: Bool = true, httpHeaders: [String: String]? = nil, delegate: PTBDataRequestDelegate?, completionHandler: PTBDataCompletionHandler? = nil)**注:**通过该方法可以根据url发起数据请求,有7个参数。method是请求类型,如果不传则取默认值POST;urlString是本次请求的地址,parameters为本次请求的参数,真正发起的请求地址和参数不一样是urlString和parameters,它会受addBaseSetting影响;addBaseSetting代表本次请求是否要拼接初始化时设置的基本url和基本参数,不传取默认值YES;httpHeaders代表请求头,默认值为nil,如果为nil则使用初始化时设置的请求头,如果httpHeaders不为nil,则本次请求使用httpHeaders做请求头,不使用初始化时设置的值;delegate和completionHandler为请求完成后的回调,分别代表代理回调和闭包回调,delegate的优先级大于completionHandler,只有当delegate为nil时才会使用completionHandler回调。
/// 通过request进行数据请求 /// /// - Parameters: /// - request: 请求的Request对象 /// - delegate: 请求完成后的代理,可选 /// - completionHandler: 请求完成的回调,当代理为空时执行该回调
public static func request(with request: URLRequest, delegate: PTBDataRequestDelegate?, completionHandler: PTBDataCompletionHandler? = nil)**注:**通过该方法可以根据request对象发起数据请求,有3个参数。request为请求的对象,request具体内容由使用者自己封装;delegate和completionHandler同上。
下载请求可以根据url、request、未下载完的数据三种方式进行请求。
/// 通过地址进行下载请求 /// /// - Parameters: /// - method: 请求类型 /// - urlString: 请求地址 /// - parameters: 请求参数 /// - directory: 缓存地址 /// - domain: 缓存domain /// - addBaseSetting: 是否添加基本设置,默认添加 /// - httpHeaders: 请求头,可选,为空则用初始设置的请求头 /// - delegate: 下载完成的代理 /// - progressHandler: 进度回调 /// - completionHandler: 下载完成后的回调,当代理为空时执行该回调
public static func download(method: PTBHTTPMethod = .get, from urlString: String, parameters: [String: Any]? = nil, httpHeaders: [String: String]? = nil, for directory: FileManager.SearchPathDirectory = .documentDirectory, in domain: FileManager.SearchPathDomainMask = .userDomainMask, addBaseSetting: Bool = true, delegate: PTBDownloadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBDownloadCompletionHandler? = nil) **注:**参数method、urlString、parameters、addBaseSetting、httpHeaders、delegate、completionHandler的意义同数据请求;directory和domain表示本次下载的文件存放的位置,皆有默认值;progressHandler为下载进度的回调闭包,只有当delegate为空时才会调用。
/// 通过Request进行下载请求 /// /// - Parameters: /// - request: 请求的Request对象 /// - directory: 缓存地址 /// - domain: 缓存domain /// - delegate: 下载完成的代理 /// - progressHandler: 进度回调 /// - completionHandler: 下载完成后的回调,当代理为空时执行该回调
public static func download(request: URLRequest, for directory: FileManager.SearchPathDirectory = .documentDirectory, in domain: FileManager.SearchPathDomainMask = .userDomainMask, delegate: PTBDownloadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBDownloadCompletionHandler? = nil)**注:**request为请求的对象,其他参数意义同上。
/// 通过未下载完成的数据进行下载请求 /// /// - Parameters: /// - resumeData: 未下载完的数据 /// - directory: 缓存地址 /// - domain: 缓存domain /// - delegate: 下载完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 下载完成后的回调,当代理为空时执行该回调
public static func download(resumingWith resumeData: Data, for directory: FileManager.SearchPathDirectory = .documentDirectory, in domain: FileManager.SearchPathDomainMask = .userDomainMask, delegate: PTBDownloadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBDownloadCompletionHandler? = nil)**注:**该方法可以根据未下载完成的数据进行下载。resumeData为上次下载未完成的data数据。其他参数同上。
上传请求可以上传Data、File、InputStream和MultipartFormData四种类型的数据,每种类型的数据都可以通过url、request两种方式请求。
Data
/// 根据data和url上传 /// /// - Parameters: /// - data: 上传的数据 /// - urlString: 上传的地址 /// - method: 请求类型 /// - addBaseSetting: 是否添加基本设置,默认添加 /// - httpHeaders: 请求头,可选,为空则用初始设置的请求头 /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(data: Data, to urlString: String, method: PTBHTTPMethod, addBaseSetting: Bool = true, httpHeaders: [String: String]? = nil, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**data为要上传的数据,其他参数意义如上。
/// 根据data和request上传 /// /// - Parameters: /// - data: 上传的数据 /// - request: 上传的request /// - method: 请求类型 /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(data: Data, with request: URLRequest, method: PTBHTTPMethod, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**参数同上。
File
/// 根据本地文件地址和url上传 /// /// - Parameters: /// - fileUrl: 上传的文件地址 /// - urlString: 上传的地址 /// - method: 请求类型 /// - addBaseSetting: 是否添加基本设置,默认添加 /// - httpHeaders: 请求头,可选,为空则用初始设置的请求头 /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(fileUrl: URL, to urlString: String, method: PTBHTTPMethod, addBaseSetting: Bool = true, httpHeaders: [String: String]? = nil, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**fileUrl为文件的本地路径;其他参数同上。
/// 根据本地文件地址和request上传 /// /// - Parameters: /// - fileUrl: 上传的文件地址 /// - request: 上传的request /// - method: 请求类型 /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(fileUrl: URL, with request: URLRequest, method: PTBHTTPMethod, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**通过request上传,参数同上。
InputStream
/// 根据stream和url上传 /// /// - Parameters: /// - stream: 上传的数据流 /// - urlString: 上传的地址 /// - method: 请求类型 /// - addBaseSetting: 是否添加基本设置,默认添加 /// - httpHeaders: 请求头,可选,为空则用初始设置的请求头 /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(stream: InputStream, to urlString: String, method: PTBHTTPMethod, addBaseSetting: Bool = true, httpHeaders: [String: String]? = nil, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**stream为上传的数据流,其他参数意义同上。
/// 根据stream和request上传 /// /// - Parameters: /// - stream: 上传的数据流 /// - request: 上传的request /// - method: 请求类型 /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(stream: InputStream, with request: URLRequest, method: PTBHTTPMethod, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**通过request上传,参数同上。
MultipartFormData
/// 多表单数据和url上传 /// /// - Parameters: /// - multipartFormData: 拼接多表单数据的闭包 /// - encodingMemoryThreshold: 编码内存的临界值 /// - url: 请求的url /// - method: 请求类型 /// - addBaseSetting: 是否添加基本设置,默认添加 /// - httpHeaders: 请求头,可选,为空则用初始设置的请求头 /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(multipartFormData: @escaping (MultipartFormData) -> Void, usingThreshold encodingMemoryThreshold: UInt64 = SessionManager.multipartFormDataEncodingMemoryThreshold, to urlString: String, method: PTBHTTPMethod = .post, addBaseSetting: Bool = true, httpHeaders: [String: String]? = nil, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**该方法可以通过多表单数据上传。multipartFormData为多表单数据拼接的闭包;encodingMemoryThreshold为编码内存的临界值,有默认值;其他参数意义同上。
/// 多表单数据和request上传 /// /// - Parameters: /// - multipartFormData: 拼接多表单数据的闭包 /// - encodingMemoryThreshold: 编码内存的临界值 /// - urlRequest: 请求的request /// - delegate: 上传完成的代理,可选 /// - progressHandler: 进度回调 /// - completionHandler: 上传完成后的回调,当代理为空时执行该回调
static func upload(multipartFormData: @escaping (MultipartFormData) -> Void, usingThreshold encodingMemoryThreshold: UInt64 = SessionManager.multipartFormDataEncodingMemoryThreshold, with urlRequest: URLRequest, delegate: PTBUploadRequestDelegate?, progressHandler: PTBProgressHandler? = nil, completionHandler: PTBUploadCompletionHandler? = nil)**注:**参数同上。
代理
public protocol PTBDataRequestDelegate {
func dataRequestSuccess(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, result: Any?)
func dataRequestFailure(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, error: Any?)
}**注:**分别有请求成功和请求失败的代理。urlString为发起请求的传进去的地址,不一定是请求的完整地址,要获取请求的完整地址最好用request?.url?.absoluteString获取;request和response分别为代理的请求和响应;result为请求成功后经过序列化的数据;error为请求失败后的错误信息。
闭包
public typealias PTBDataCompletionHandler = (_ isSuccess: Bool, _ urlString: String?, _ request: URLRequest?, _ response: HTTPURLResponse?, _ result: Any?, _ error: Any?) -> ()**注:**闭包的参数多了isSuccess,标识本次请求是否成功;其他参数同代理。
代理
public protocol PTBDownloadRequestDelegate {
func downloadRequestSuccess(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, destinationUrl: URL?, result: Any?)
func downloadRequestFailure(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, destinationUrl: URL?, error: Any?)
func downloadProgress(urlString: String?, request: URLRequest?, progress: Progress)
}**注:**代理中请求和成功方法参数多了destinationUrl,存储下载后存放的文件目录;其他参数同数据请求;下载进度回调里progress存放进度信息。
闭包
public typealias PTBDownloadCompletionHandler = (_ isSuccess: Bool, _ request: URLRequest?, _ response: HTTPURLResponse?, _ destinationUrl: URL?, _ result: Any?, _ error: Any?) -> ()public typealias PTBProgressHandler = (_ progress: Progress) -> ()注:参数同上。
代理
public protocol PTBUploadRequestDelegate {
func uploadRequestSuccess(fileUrl: URL?, request: URLRequest?, response: HTTPURLResponse?, result: Any?)
func uploadRequestFailure(fileUrl: URL?, request: URLRequest?, response: HTTPURLResponse?, error: Any?)
func uploadProgress(fileUrl: URL?, request: URLRequest?, progress: Progress)
}**注:**上传代理同样有三个,参数fileUrl标识上传文件的本地目录,其他参数同下载。
闭包
public typealias PTBUploadCompletionHandler = (_ isSuccess: Bool, _ fileUrl: URL?, _ request: URLRequest?, _ response: HTTPURLResponse?, _ result: Any?, _ error: Any?) -> ()**注:**参数同上。
一、通过Cocopods导入Alamofire开源库
# Uncomment this line to define a global platform for your project
platform :ios, '8.0'
inhibit_all_warnings!
# Uncomment this line if you're using Swift
use_frameworks!9
target 'YourTargetName' do
pod 'Alamofire'
end
二、将PTBNetWorkingTool.swift文件加到项目中。
三、对PTBNetWorkingTool的基础参数进行设置(如果需要),通常在Appdelegate文件里。
PTBNetWorkingTool.setBaseUrl(baseUrl: "http://www.huxiamai.com/Public/api/")
PTBNetWorkingTool.setBaseParameters(parameters: ["CLIENT_SIGN" : "wshoppingApp2016"])
PTBNetWorkingTool.setResponseType(type: .json)
PTBNetWorkingTool.setHttpHeaders(httpHeaders: ["application/x-www-form-urlencoded" : "Content-Type", "application/json" : "Accept"])代理回调
发起请求:
PTBNetWorkingTool.request(to: "PublicManage/smsVerifyCode", parameters: ["sellerNo" : "13333333333"], delegate: self)接收回调:
// MARK: - PTBDataRequestDelegate
func dataRequestSuccess(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, result: Any?) {
if let _ = result {
print("请求到的数据为:", result!)
}
}
func dataRequestFailure(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, error: Any?) {
if let _ = error {
print("请求出错,", error!)
}
}闭包回调
func dataRequest() {
PTBNetWorkingTool.request(to: "PublicManage/smsVerifyCode", parameters: ["sellerNo" : "13333333333"], delegate: nil) { (isSuccess, urlString, request, response, result, error) in
if isSuccess {
if let _ = result {
print("请求到的数据为:", result!)
}
} else {
if let _ = error {
print("请求出错,", error!)
}
}
}
}代理回调
发起请求:
PTBNetWorkingTool.download(from: "http://oerrev9h1.bkt.clouddn.com//Lable/20161224/585e15a843bcd.xml", addBaseSetting: false, delegate: self)接收回调:
// MARK: - PTBDownloadRequestDelegate
func downloadRequestSuccess(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, destinationUrl: URL?, result: Any?) {
if let _ = result {
print("下载的文件位于:\(destinationUrl),文件为:", result!)
}
}
func downloadRequestFailure(urlString: String?, request: URLRequest?, response: HTTPURLResponse?, destinationUrl: URL?, error: Any?) {
if let _ = error {
print("下载出错,", error!)
}
}
func downloadProgress(urlString: String?, request: URLRequest?, progress: Progress) {
print("下载进度:" + progress.localizedDescription)
}闭包回调
func downloadRequest() {
PTBNetWorkingTool.download(from: "http://oerrev9h1.bkt.clouddn.com//Lable/20161224/585e15a843bcd.xml", addBaseSetting: false, delegate: nil, progressHandler: { progress in
print("下载进度:" + progress.localizedDescription)
}) { (isSuccess, request, response, destinationUrl, result, error) in
if isSuccess {
if let _ = result {
print("下载的文件位于:\(destinationUrl),文件为:", result!)
}
} else {
if let _ = error {
print("下载出错,", error!)
}
}
}
}代理回调
发起请求:
PTBNetWorkingTool.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImagePNGRepresentation(UIImage(named: "messi")!)!, withName: "avatar_file", fileName: "avatar_file.jpeg", mimeType: "image/jpeg")
},to: "FileManage/Upload", delegate: self)接收回调:
// MARK: - PTBUploadRequestDelegate
func uploadRequestSuccess(fileUrl: URL?, request: URLRequest?, response: HTTPURLResponse?, result: Any?) {
if let _ = result {
print("上传成功,", result!)
}
}
func uploadRequestFailure(fileUrl: URL?, request: URLRequest?, response: HTTPURLResponse?, error: Any?) {
if let _ = error {
print("上传失败,", error!)
}
}
func uploadProgress(fileUrl: URL?, request: URLRequest?, progress: Progress) {
print("上传进度:" + progress.localizedDescription)
}闭包回调
func uploadRequest() {
PTBNetWorkingTool.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImagePNGRepresentation(UIImage(named: "messi")!)!, withName: "avatar_file", fileName: "avatar_file.jpeg", mimeType: "image/jpeg")
}, to: "FileManage/Upload", delegate: nil, progressHandler: { progress in
print("上传进度:" + progress.localizedDescription)
}, completionHandler: { (isSuccess, fileUrl, request, response, result, error) in
if isSuccess {
if let _ = result {
print("上传成功:", result!)
}
} else {
if let _ = error {
print("上传失败,", error!)
}
}
})
}**注:**具体使用见Demo。
2017.05.22 By PerTerbin