//
|
// NetworkRequest.swift
|
// HandyJSON
|
//
|
// Created by Sweet on 2018/12/25.
|
// Copyright © 2018 Sweet. All rights reserved.
|
//
|
|
import Foundation
|
import SwifterSwift
|
import Alamofire
|
import HandyJSON
|
import RxSwift
|
import SVProgressHUD
|
|
// 假设这是服务端返回的统一定义的response格式
|
struct BaseResponse<T :HandyJSON>: HandyJSON {
|
var sysTime: Int = 0
|
var code: Int = -1 // 服务端返回码
|
var data: T? = nil // 具体的data的格式和业务相关,故用泛型定义
|
var msg: String = ""
|
}
|
|
struct BaseResponseList<T :HandyJSON>: HandyJSON {
|
var list: [T] = []
|
var pages:Int = 0
|
var total:Int = 0
|
|
var energyTotal:Int?
|
}
|
|
struct BaseData<T: HandyJSON>: HandyJSON {
|
var records = [T]()
|
}
|
|
struct SimpleModel: HandyJSON {
|
|
}
|
|
extension String: HandyJSON{
|
|
}
|
extension Array: HandyJSON{
|
|
}
|
extension Bool: HandyJSON{
|
|
}
|
|
extension Int: HandyJSON{
|
|
}
|
|
extension Double: HandyJSON{
|
|
}
|
|
class ParamsAppender: NSObject {
|
var url: URL
|
var params:Dictionary = [String: Any]()
|
|
private init(url: String){
|
self.url = URL(string: url)!
|
}
|
|
@discardableResult
|
func interface(url: String) -> ParamsAppender {
|
self.url.appendPathComponent(url)
|
return self
|
}
|
|
@discardableResult
|
func append(key: String,value: Bool) -> ParamsAppender {
|
params += ["\(key)":"\(value)"]
|
return self
|
}
|
|
@discardableResult
|
func append(key: String,value: String?) -> ParamsAppender {
|
if value != nil && value?.isEmpty == false {
|
params += ["\(key)":"\(value!)"]
|
}
|
return self
|
}
|
|
@discardableResult
|
func append(key: String,value: Array<String>) -> ParamsAppender {
|
if value.isEmpty == false {
|
params += ["\(key)":value]
|
}
|
return self
|
}
|
|
|
@discardableResult
|
func append(key: String, value: Int?) -> ParamsAppender {
|
if value != nil{
|
params += ["\(key)":value!]
|
}
|
return self
|
}
|
|
@discardableResult
|
func append(key: String, value: Int64) -> ParamsAppender {
|
params += ["\(key)":value]
|
return self
|
}
|
|
@discardableResult
|
func append(key: String, value: Double?) -> ParamsAppender {
|
if value != nil{
|
params += ["\(key)":value!]
|
}
|
return self
|
}
|
|
@discardableResult
|
func append(key: String,data: Data?) -> ParamsAppender {
|
if data != nil{
|
params += ["\(key)": data!]
|
}
|
return self
|
}
|
|
@discardableResult
|
func append(key: String,url: URL) -> ParamsAppender {
|
params += ["\(key)":"\(url)"]
|
return self
|
}
|
|
@discardableResult
|
func append(dic: [String : Any]) -> ParamsAppender {
|
params += dic
|
return self
|
}
|
|
/// 参数加密
|
@discardableResult
|
func done() -> Parameters {
|
// var paramsArray: [String] = []
|
// // 排序
|
// let sortedArray: [String] = Array(params.keys).sorted()
|
//
|
// //防止自签名而错误
|
// if !sortedArray.contains("sign"){
|
// for item in sortedArray{
|
// // 拼接字符串
|
// if params.has(key: item){
|
// paramsArray.append("\(item)=\(params[item]!)")
|
// }
|
// }
|
// let content = paramsArray.joined(separator: "&")
|
//
|
//// params += ["sign": "\(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))"]
|
//
|
//#if DEBUG
|
//// LogInfo("签名:\(content) ----- \(content.jq_hmacBase64(algorithm: .SHA1, key: SHAKEY))")
|
//#endif
|
// }
|
return self.params
|
}
|
|
class func build(url: String) -> ParamsAppender {
|
return ParamsAppender(url: url)
|
}
|
|
}
|
class NetworkRequest {
|
|
static let sharedSessionManager: Alamofire.Session = {
|
let configuration = URLSessionConfiguration.default
|
configuration.timeoutIntervalForRequest = 10
|
return Alamofire.Session(configuration: configuration)
|
}()
|
enum NetRequestError: Error {
|
case Other(Int,String)
|
case URLNotFound
|
case DownloadFailed
|
case InvaildSession
|
case ModelError(String)
|
case DataAnalysis(String)
|
}
|
|
class func request<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true,ignoreAlert:Bool = false) -> Observable<BaseResponse<T>>{
|
|
return Observable<BaseResponse<T>>.create{ ob in
|
guard NetworkReachabilityManager.init(host: All_Url)!.isReachable else {
|
// alertError(msg: "当前网络不可用")
|
ob.onError(AFError.invalidURL(url: params.url))
|
return Disposables.create{}
|
}
|
|
if progress {showHUD()}
|
|
var headers = HTTPHeaders()
|
if let token = UserViewModel.getLoginInfo()?.accessToken{
|
headers.add(name: "Authorization", value: "Bearer" + " " + token)
|
LogInfo("USER_token:Bearer \(token)")
|
}
|
|
if encoding is JSONEncoding {
|
headers.add(name: "Content-Type", value: "application/json;charset=UTF-8")
|
}
|
|
var newEncoding: ParameterEncoding
|
if encoding != nil {
|
newEncoding = encoding!
|
} else {
|
// #if DEBUG
|
// newEncoding = URLEncoding.queryString
|
// #else
|
newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
|
// #endif
|
}
|
|
sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding, headers:headers).validate().responseData{response in
|
LogInfo("请求地址:\(params.url)")
|
LogInfo("请求参数:\(params.params)")
|
if progress{
|
hiddenHUD(0.5)
|
}
|
|
guard response.error == nil else {
|
LogError("\(response.error!)")
|
|
var errorString = ""
|
errorString.append("服务器故障:\(response.error!.localizedDescription)")
|
if let code = response.error?.responseCode{
|
errorString.append("\n【错误码:\(code)】")
|
}
|
if !ignoreAlert{
|
alert(msg: "网络连接超时")
|
}
|
ob.onError(response.error!)
|
return
|
}
|
if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
|
LogResponse(try! JSONSerialization.jsonObject(with: data))
|
if let next = BaseResponse<T>.deserialize(from: jsonString){
|
switch next.code{
|
case 200:ob.onNext(next)
|
case 401:
|
ob.onError(NetRequestError.InvaildSession)
|
sceneDelegate?.needLogin()
|
case 501:
|
sceneDelegate?.needLogin()
|
ob.onError(NetRequestError.InvaildSession)
|
default:
|
if !ignoreAlert{
|
alertError(msg: "\(next.msg)")
|
}
|
ob.onError(NetRequestError.Other(next.code,next.msg))
|
}
|
}
|
}
|
ob.onCompleted()
|
}
|
return Disposables.create{}
|
}
|
}
|
}
|
extension Dictionary {
|
mutating func append(dict: Dictionary) {
|
dict.forEach { (key, value) in
|
self.updateValue(value, forKey: key)
|
}
|
}
|
}
|
|
|
func createError(text:String,code:Int)->AFError{
|
return AFError.createURLRequestFailed(error: NSError(domain: text, code: code))
|
}
|