import UIKit
import Alamofire
import SwiftyJSON
/** 请求成功回调*/
typealias NetSuccessBlock = (NSDictionary,SwiftyJSON.JSON) -> Void
/** 请求失败回调*/
typealias NetFaliedBlock = (AFSErrorInfo) -> Void
class AFSNet: NSObject {
private var sessionManager :Alamofire.SessionManager?
private var baseUrl = "http://192.168.1.189:9600"
//单例
static let shareAFNet = AFSNet()
//
//重写初始化方法
override init() {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 20.0
sessionManager = Alamofire.SessionManager(configuration: configuration)
}
/** GET请求*/
func GET(_ urlStr:String, _ param:Parameters?,_ isShowHUD:Bool,success:@escaping NetSuccessBlock,falied:@escaping NetFaliedBlock) {
let url = baseUrl + urlStr
let encodStr = url.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
let headers : HTTPHeaders = ["Content-Type":"application/json;charset=utf-8"] // http
self.sessionManager?.request(encodStr!, method: .get, parameters: param, encoding: URLEncoding.default, headers: headers).responseJSON(completionHandler: { (response) in
if response.result.error != nil { // 没网络
self.handleFaliedData(response.result.error! as NSError, falied: falied)
}else if let value = response.result.value { // 有网络
if JSON(value)["error"].string != nil {// 请求失败
self.handleRequestFaliedData(JSON(value), falied: falied)
}else{ // 请求成功
self.handleRequestSuccessData(value, success: success, falied: falied)
}
}
})
}
/** POST请求*/
func POST(_ urlStr:String, _ param:Parameters?,_ isShowHUD:Bool,success:@escaping NetSuccessBlock,falied:@escaping NetFaliedBlock) {
let url = baseUrl + urlStr
let encodStr = url.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
let headers : HTTPHeaders = ["Content-Type":"application/json;charset=utf-8"] // http
//let headers : HTTPHeaders = ["Content-Type":"application/x-www-form-urlencoded"] //https
self.sessionManager?.request(encodStr!, method: .post, parameters: param, encoding: JSONEncoding.default, headers: headers)
//.validate() <注:用response.result.isSuccess 判断是否请求成功>
.responseJSON(completionHandler: { (response) in
if response.result.error != nil { // 没网络
self.handleFaliedData(response.result.error! as NSError, falied: falied)
}else if let value = response.result.value { // 有网络
if JSON(value)["error"].string != nil {// 请求失败
self.handleRequestFaliedData(JSON(value), falied: falied)
}else{ // 请求成功
self.handleRequestSuccessData(value, success: success, falied: falied)
}
}
})
}
/** 处理请求成功数据*/
private func handleRequestSuccessData(_ data:Any,success:NetSuccessBlock,falied:NetFaliedBlock) {
let DicJSON = data as! NSDictionary
let SwiftJSON = JSON(data)
if SwiftJSON["code"].int == 1{
success(DicJSON,SwiftJSON)
}else{
var errorInfo = AFSErrorInfo()
errorInfo.code = SwiftJSON["code"].int == nil ? 0:SwiftJSON["code"].int!
errorInfo.message = SwiftJSON["msg"].string == nil ? "":SwiftJSON["msg"].string!
falied(errorInfo)
}
}
/** 处理请求失败数据*/
func handleRequestFaliedData(_ resurt:JSON,falied:NetFaliedBlock) {
var errorInfo = AFSErrorInfo()
errorInfo.error = resurt["error"].string == nil ? "":resurt["error"].string!
errorInfo.code = resurt["status"].int == nil ? 0:resurt["status"].int!
errorInfo.message = "未知错误"
if (errorInfo.code == 404 ){
errorInfo.message = "访问接口存在"
}else if (errorInfo.code == -1001) {
errorInfo.message = "请求超时"
}else if (errorInfo.code == -1004) {
errorInfo.message = "服务器没有启动"
}
falied(errorInfo)
}
/** 处理失败数据*/
func handleFaliedData(_ error:NSError,falied:NetFaliedBlock) {
var errorInfo = AFSErrorInfo()
errorInfo.code = error.code
errorInfo.message = "未知错误"
if (error.code == -1004){
errorInfo.message = "服务器没有启动"
}else if (error.code == -1009) {
errorInfo.message = "无网络连接"
}
falied(errorInfo)
}
/**
code = -1004 服务器没有启动
code = 500+ 服务器内部出错
code = 404 接口不存在
code = 200 请求成功
code = -1001 请求超时
code = -1009 网络断开
code = -999 SSL证书问题
*/
}
/** 访问出错具体原因 */
struct AFSErrorInfo {
var code = 0
var message = ""
var error = ""
}
/** 从JSON里取value*/
extension JSON{
/** 取字符串*/
func strValue(_ jsonKeys:[String])->String{
var tempVlaue = self
for index in 0..<jsonKeys.count {
tempVlaue = tempVlaue[jsonKeys[index]]
}
return tempVlaue.string != nil ? tempVlaue.string! : ""
}
/** 取整数*/
func intValue(_ jsonKeys:[String])->Int{
var tempVlaue = self
for index in 0..<jsonKeys.count {
tempVlaue = tempVlaue[jsonKeys[index]]
}
return tempVlaue.int != nil ? tempVlaue.int! : -99
}
/** 取Double*/
func douValue(_ jsonKeys:[String])->Double{
var tempVlaue = self
for index in 0..<jsonKeys.count {
tempVlaue = tempVlaue[jsonKeys[index]]
}
return tempVlaue.double != nil ? tempVlaue.double! : -0.00
}
}