美文网首页
封装Alamofire+SwiftyJSON进行网络请求:

封装Alamofire+SwiftyJSON进行网络请求:

作者: 歌手的剑 | 来源:发表于2017-05-04 19:13 被阅读1868次

NetworkTools类封装

import UIKit
import Alamofire
import SwiftyJSON

/// 请求响应状态
///
/// - success: 响应成功
/// - unusual: 响应异常
/// - failure: 请求错误
enum ResponseStatus: Int {
    case success  = 0
    case unusual  = 1
    case failure  = 3
}

/// 网络请求回调闭包 status:响应状态 result:JSON tipString:提示给用户的信息
typealias NetworkFinished = (_ status: ResponseStatus, _ result: JSON?, _ tipString: String?) -> ()

class NetworkTools: NSObject {
    
    /// 网络工具类单例
    static let shared = NetworkTools()
    
    var rootDomain: String {
        #if DEBUG
            return URL_ROOT_DOMAIN_DEBUG + URL_SUB_DOMAIN
        #else
            return URL_ROOT_DOMAIN_RELEASE + URL_SUB_DOMAIN
        #endif
    }
    
}

// MARK: - 基础请求方法
extension NetworkTools {
    //    in view: UIView = UIApplication.shared.keyWindow!,title: String? = nil
    /**
     GET请求
     
     - parameter URLString:  urlString
     - parameter parameters: 参数
     - parameter finished:   完成回调
     */
    func get(_ APIString: String, parameters: [String : Any]?, needHeaders: Bool = true, needLoading: Bool = false, finished: @escaping NetworkFinished) {
        
        if needLoading {
            HexaLoading.show(in: UIApplication.shared.keyWindow!)
        }
        
        let headers = needHeaders ? self.headers() : nil
        
        DLog("\n🌎🌎🌎\nRequest: \nURL: \(rootDomain + APIString)\nMethod: get\nHeaders:\(String(describing: headers))\nParameters: \(String(describing: parameters))\n🌎🌎🌎")
        
        Alamofire.request(rootDomain + APIString, method: .get, parameters: parameters, headers: headers).responseJSON { (response) in
            self.handle(response: response, finished: finished, needLoading: needLoading)
        }
        
    }
    
    /**
     POST请求
     
     - parameter URLString:  urlString
     - parameter parameters: 参数
     - parameter finished:   完成回调
     */
    func post(_ APIString: String, parameters: [String : Any]?, needHeaders: Bool = true, needLoading: Bool = false, finished: @escaping NetworkFinished) {
        
        
        if needLoading {
            HexaLoading.show()
        }
        
        let headers = needHeaders ? self.headers() : nil
        
        DLog("\n🌎🌎🌎\nRequest: \nURL: \(rootDomain + APIString)\nMethod: post\nHeaders:\(String(describing: headers))\nParameters: \(String(describing: parameters))\n🌎🌎🌎")
        
        Alamofire.request(rootDomain + APIString, method: .post, parameters: parameters, headers: headers).responseJSON { (response) in
            self.handle(response: response, finished: finished, needLoading: needLoading)
        }
    }
    
    /// 处理响应结果
    ///
    /// - Parameters:
    ///   - response: 响应对象
    ///   - finished: 完成回调
    fileprivate func handle(response: DataResponse<Any>, finished: @escaping NetworkFinished, needLoading: Bool) {

        if needLoading {
            HexaLoading.hide()
        }
        
        switch response.result {
        case .success(let value):
            let json = JSON(value)
            DLog(json)
            if json["code"].string == "OK" {
                finished(.success, json, json["message"].string)
            } else {
                finished(.unusual, json, json["message"].string)
            }
        case .failure(let error):
            DLog(error)
            finished(.failure, nil, error.localizedDescription)
        }
    }
    
    /// 获取请求头
    ///
    /// - Returns: 字典-请求头内容
    fileprivate func headers() -> Dictionary<String, String>! {
        
        let acceptLanguage = Locale.preferredLanguages
            .prefix(6)
            .enumerated()
            .map { index, languageCode in
                let quality = 1.0 - (Double(index) * 0.1)
                return "\(languageCode),q=\(quality)"
            }
            .joined(separator: ", ")
        
        let userAgent: String = {
            if let info = Bundle.main.infoDictionary {
                return "HEXA/iOS/" + (info["CFBundleShortVersionString"] as? String ?? "Unknown")
            }
            return "HEXA/iOS/Unknown"
        }()
        
        return [
            "Accept-Encoding": "gzip;q=1.0, compress;q=0.5",
            "Accept-Language": acceptLanguage,
            "User-Agent": userAgent,
            
            "X-App-OSVersion": UIDevice.systemVersionName,
            "X-App-Device": UIDevice.machineModelName,
            "X-User-AccessToken": UserDefaults.standard.string(forKey: ACCESSTOKEN_KEY) ?? ""
        ]
    }
    
}

调用过程

        NetworkTools.shared.get(URL_CHECKUPDATE, parameters: nil, needLoading: true) {
            DLog($0)
            DLog($1)
            DLog($2)
        }

相关文章

  • 封装Alamofire+SwiftyJSON进行网络请求:

    NetworkTools类封装 调用过程

  • 关于Retrofit的理解之Hello Retrofit

    前言 Retrofit是一个RESTful的网络请求框架的一种封装,Retrofit只需要对网络请求信息进行封装,...

  • 网络请求

    ios开发 合理封装请求接口 概述 如今大多的app都会与网络打交道,作为开发者 合理的对网络后台请求接口进行封装...

  • 【Android开发学Flutter】封装网络请求

    HTTP网络请求每个项目会用到,封装一个好用HTTP网络请求工具很有必要,下面是基于 dio 进行的二次封装。 封...

  • ReactiveCocoa简单使用

    传统网络请求封装 ReactiveCocoa网络请求封装 关于传统的网络请求的封装,大家都很熟悉,这里就不再赘述了...

  • ASIHTTPRequest封装

    不知道现在是否还有用ASI进行网络请求的,上一篇文章说到公司项目比较老,网络请求没有进行封装,每次发送网络请求是这...

  • 30.axios的封装

    为什么要对框架进行封装 我们在进行网络请求的时候,可以在每个页面引入axios,然后通过它发送网络请求,但是这样做...

  • Flutter Dio网络请求封装(GET,POST)

    一、前言 最近学习Flutter进行到了网络这一块,所以就花了点时间对网络请求进行了简单的封装,以便使用,网络请求...

  • retrofit进行网络请求框架封装

    在项目的开发当中,网络请求可谓是至关重要的一个环节,我们需要对于的请求方法[post,get,delete...]...

  • swift网络请求

    AFNetworking三方封装的网络请求 AFNetworking三方封装的网络请求

网友评论

      本文标题:封装Alamofire+SwiftyJSON进行网络请求:

      本文链接:https://www.haomeiwen.com/subject/xlydtxtx.html