//
|
// NetworkRequest.swift
|
// HandyJSON
|
//
|
// Created by Sweet on 2018/12/25.
|
// Copyright © 2018 Sweet. All rights reserved.
|
//
|
|
import Foundation
|
import SwifterSwift
|
import Alamofire
|
import MBProgressHUD
|
|
// 假设这是服务端返回的统一定义的response格式
|
struct BaseResponse<T :HandyJSON>: HandyJSON {
|
var sysTime: Int = 0
|
var code: Int = -1 // 服务端返回码
|
var data: T? = nil // 具体的data的格式和业务相关,故用泛型定义
|
var msg: String = ""
|
}
|
|
struct BaseData<T: HandyJSON>: HandyJSON {
|
var records = [T]()
|
}
|
|
struct SimpleModel: HandyJSON {
|
|
}
|
struct HtmlModel: HandyJSON {
|
var content = ""
|
var content1 = ""
|
var id = 0
|
var type = 0
|
}
|
|
extension String: HandyJSON{
|
|
}
|
extension Array: HandyJSON{
|
|
}
|
extension Bool: HandyJSON{
|
|
}
|
|
class ParamsAppender: NSObject {
|
var url: URL
|
var params:Dictionary = [String: Any]()
|
|
private init(url: String){
|
self.url = URL(string: url)!
|
|
}
|
|
func interface(url: String) -> ParamsAppender {
|
self.url.appendPathComponent(url)
|
return self
|
}
|
|
func append(key: String,value: String) -> ParamsAppender {
|
if value.isEmpty{return self}
|
params += ["\(key)":"\(value)"]
|
return self
|
}
|
|
func append(key: String,value: Bool) -> ParamsAppender {
|
params += ["\(key)":"\(value)"]
|
return self
|
}
|
|
func append(key: String,value: String?) -> ParamsAppender {
|
if value?.isEmpty ?? true || value == "" { return self }
|
params += ["\(key)":"\(value ?? "")"]
|
return self
|
}
|
|
func append(key: String, value: Int?) -> ParamsAppender {
|
// if value == nil || value == 0 { return self }
|
params += ["\(key)":"\(value ?? 0)"]
|
return self
|
}
|
func append(key: String, value: Int64) -> ParamsAppender {
|
params += ["\(key)":"\(value)"]
|
return self
|
}
|
func append(key: String, value: Double) -> ParamsAppender {
|
params += ["\(key)":"\(value)"]
|
return self
|
}
|
|
func append(key: String,data: Data?) -> ParamsAppender {
|
if data != nil{
|
params += ["\(key)": data!]
|
}
|
return self
|
}
|
|
func append(key: String,url: URL) -> ParamsAppender {
|
params += ["\(key)":"\(url)"]
|
return self
|
}
|
|
func append(dic: [String : Any]) -> ParamsAppender {
|
params += dic
|
return self
|
}
|
|
/// 参数加密
|
func done() -> Parameters {
|
return self.params
|
}
|
|
class func build(url: String) -> ParamsAppender {
|
return ParamsAppender(url: url)
|
}
|
|
func googleMapDone() -> ParamsAppender {
|
var paramsArray: [String] = []
|
// 排序
|
let sortedArray: [String] = Array(params.keys).sorted()
|
for item in sortedArray{
|
// 拼接字符串
|
if params.has(key: item){
|
paramsArray.append("\(item)=\(params[item]!)")
|
}
|
}
|
let content = paramsArray.joined(separator: "&")
|
params += ["key": GoogleAppKey]
|
//https://developers.google.com/maps/faq#languagesupport
|
params += ["language":"en"]
|
|
return self
|
}
|
|
}
|
class NetworkRequest {
|
|
static let sharedSessionManager: Alamofire.Session = {
|
let configuration = URLSessionConfiguration.default
|
configuration.timeoutIntervalForRequest = 15
|
return Alamofire.Session(configuration: configuration)
|
}()
|
enum NetRequestError: Error {
|
case Other
|
case URLNotFound
|
case DownloadFailed
|
}
|
|
class func request<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true) -> Observable<BaseResponse<T>>{
|
return Observable<BaseResponse<T>>.create{ ob in
|
var hud: MBProgressHUD?
|
if progress {
|
hud = MBProgressHUD.showAdded(to: screnDelegate!.window!, animated: true)
|
hud?.bezelView.style = .solidColor
|
hud?.contentColor = .white
|
hud?.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.removeFromSuperViewOnHide = true
|
}
|
|
var headers = HTTPHeaders()
|
if let token = UserViewModel.getUserInfo()?.token {
|
headers.add(name: "Authorization", value: "Bearer" + " " + token)
|
LogInfo("USER_token:\(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 {
|
newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
|
}
|
|
sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding, headers:headers).validate().responseData{response in
|
LogInfo("请求地址:\(params.url)")
|
LogInfo("请求参数:\(params.params)")
|
hud?.hide(animated: true)
|
if response.error != nil {
|
LogError("\(response.error!)")
|
alert(msg: response.error!.localizedDescription)
|
ob.onError(response.error!)
|
}else if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
|
if let next = BaseResponse<T>.deserialize(from: jsonString){
|
LogInfo("返回数据:\(next.toJSON())")
|
if next.code == 200{
|
ob.onNext(next)
|
}else if next.code == 700{
|
let nav = BaseNavigationController(rootViewController: LoginVC())
|
UserViewModel.clearUserInfo()
|
screnDelegate?.window?.rootViewController = nav
|
alert(msg: "Login session invaild")
|
}else {
|
alert(msg: next.msg)
|
ob.onError(NetRequestError.Other)
|
}
|
}else{
|
alert(msg: "数据解析失败")
|
ob.onError(NetRequestError.Other)
|
}
|
}else{
|
alert(msg: "解析失败")
|
ob.onError(NetRequestError.Other)
|
}
|
ob.onCompleted()
|
}
|
return Disposables.create{}
|
}
|
}
|
|
class func requestMap<T: HandyJSON>(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true) -> Observable<T>{
|
return Observable<T>.create{ ob in
|
var hud: MBProgressHUD?
|
if progress {
|
hud = MBProgressHUD.showAdded(to: screnDelegate!.window!, animated: true)
|
hud?.bezelView.style = .solidColor
|
hud?.contentColor = .white
|
hud?.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.removeFromSuperViewOnHide = true
|
}
|
var newEncoding: ParameterEncoding
|
if encoding != nil {
|
newEncoding = encoding!
|
} else {
|
newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
|
}
|
|
sharedSessionManager.request(params.url.absoluteString, method: method, parameters:params.done(), encoding: newEncoding).validate().responseData{response in
|
LogInfo("请求地址:\(params.url)")
|
LogInfo("请求参数:\(params.params)")
|
hud?.hide(animated: true)
|
if response.error != nil {
|
LogError("\(response.error!)")
|
alert(msg: response.error!.localizedDescription)
|
ob.onError(response.error!)
|
}else if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
|
if let next = T.deserialize(from: jsonString){
|
LogInfo("返回数据:\(next.toJSON())")
|
ob.onNext(next)
|
}else{
|
alert(msg: "数据解析失败")
|
ob.onError(NetRequestError.Other)
|
}
|
}else{
|
alert(msg: "解析失败")
|
ob.onError(NetRequestError.Other)
|
}
|
ob.onCompleted()
|
}
|
return Disposables.create{}
|
}
|
}
|
|
class func requestData(params: ParamsAppender, method: HTTPMethod, encoding: ParameterEncoding? = nil, progress: Bool = true) -> Observable<Data>{
|
return Observable<Data>.create{ ob in
|
var hud: MBProgressHUD?
|
if progress {
|
hud = MBProgressHUD.showAdded(to: app.window!, animated: true)
|
hud?.bezelView.style = .solidColor
|
hud?.contentColor = .white
|
hud?.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.removeFromSuperViewOnHide = true
|
}
|
|
var headers = HTTPHeaders()
|
if let token = UserViewModel.getUserInfo()?.token {
|
headers.add(name: "Authorization", value: "Bearer" + " " + token)
|
LogInfo("USER_token:\(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 {
|
newEncoding = method == .post ? URLEncoding.httpBody : URLEncoding.queryString
|
}
|
|
sharedSessionManager.request(params.url.absoluteString, method: method, parameters: params.done(), encoding: newEncoding, headers: headers).validate().responseData{response in
|
LogInfo("请求地址:\(params.url)")
|
LogInfo("请求参数:\(params.params)")
|
hud?.hide(animated: true)
|
if response.error != nil {
|
LogError("\(response.error!)")
|
ob.onError(response.error!)
|
}else if let data = response.data{
|
LogInfo("返回数据:\(data)")
|
ob.onNext(data)
|
}
|
ob.onCompleted()
|
}
|
return Disposables.create{}
|
}
|
}
|
|
/// 带code请求的
|
/// - Parameters:
|
/// - params: <#params description#>
|
/// - method: <#method description#>
|
/// - progress: <#progress description#>
|
/// - Returns: <#description#>
|
class func requestCode<T: HandyJSON>(params: ParamsAppender,method: HTTPMethod,progress: Bool = true) -> Observable<BaseResponse<T>>{
|
return Observable<BaseResponse<T>>.create{ ob in
|
var hud: MBProgressHUD?
|
if progress{
|
hud = MBProgressHUD.showAdded(to: screnDelegate!.window!, animated: true)
|
hud?.bezelView.style = .solidColor
|
hud?.contentColor = .white
|
hud?.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud?.removeFromSuperViewOnHide = true
|
}
|
sharedSessionManager.request(params.url.absoluteString, method: method, parameters:
|
params.done(),encoding: URLEncoding.default).validate().responseData{response in
|
LogInfo("请求地址:\(params.url)")
|
LogInfo("请求参数:\(params.params)")
|
if response.error != nil {
|
hud?.hide(animated: true)
|
// alert(msg: "请求失败")
|
LogInfo("\(response.error!)")
|
ob.onError(response.error!)
|
}else if let data = response.data,let jsonString = String(data: data, encoding: String.Encoding.utf8){
|
|
hud?.hide(animated: true)
|
LogInfo("返回数据:\(jsonString)")
|
if let next = BaseResponse<T>.deserialize(from: jsonString){
|
ob.onNext(next)
|
}else{
|
hud?.hide(animated: true)
|
// alert(msg: "请求失败")
|
LogInfo("error")
|
}
|
}else{
|
hud?.hide(animated: true)
|
// alert(msg: "请求失败")
|
LogInfo("Netrequest-Tag:No data")
|
}
|
ob.onCompleted()
|
}
|
return Disposables.create{}
|
}
|
}
|
/// 上传
|
/// - Parameter params: <#params description#>
|
class func upload<T: HandyJSON>(params: ParamsAppender) -> Observable<BaseResponse<T>> {
|
return Observable<BaseResponse<T>>.create{ob in
|
let hud = MBProgressHUD.showAdded(to: screnDelegate!.window!, animated: true)
|
hud.bezelView.style = .solidColor
|
hud.contentColor = .white
|
hud.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8)
|
hud.removeFromSuperViewOnHide = true
|
|
var headers = HTTPHeaders()
|
if let token = UserViewModel.getUserInfo()?.token {
|
headers.add(name: "Authorization", value: "Bearer" + " " + token)
|
LogInfo("USER_token:\(token)")
|
}
|
|
|
AF.upload(multipartFormData: { data in
|
let p = params
|
LogInfo("Netrequest-Upload-Starting.")
|
for key in p.params{
|
if let d = key.value as? Data {
|
LogInfo("Netrequest-Upload-Appending-Data: Length = \(d.count) bytes")
|
|
data.append(d, withName: key.key, fileName: "\(Date().timeIntervalSince1970).png", mimeType: "image/png")
|
} else if let url = key.value as? URL {
|
LogInfo("Netrequest-Upload-Appending-Data: Url = \(url)")
|
data.append(url, withName: key.key)
|
}
|
}
|
}, to: params.url, method: .post, headers: headers) .uploadProgress(queue: .main, closure: { progress in
|
// progressClosure(progress.fractionCompleted)
|
}).responseJSON(completionHandler: { data in
|
print("upload finished: \(data)")
|
|
}).response { (response) in
|
|
hud.hide(animated: true)
|
switch response.result {
|
case .success(let dataObj):
|
// alert(msg: "上传成功")
|
let jsonString = String(data: dataObj ?? Data(), encoding: String.Encoding.utf8)
|
if let next = BaseResponse<T>.deserialize(from: jsonString){
|
ob.onNext(next)
|
}
|
case .failure(let err):
|
alert(msg: "上传失败")
|
print("upload err: \(err)")
|
}
|
|
}
|
return Disposables.create{
|
|
}
|
|
}
|
}
|
}
|
extension Dictionary {
|
mutating func append(dict: Dictionary) {
|
dict.forEach { (key, value) in
|
self.updateValue(value, forKey: key)
|
}
|
}
|
}
|