美文网首页
Alamofire数据拦截并进行加密

Alamofire数据拦截并进行加密

作者: 舟_e9ce | 来源:发表于2020-04-02 10:34 被阅读0次

在swift项目中遇到url,数据等内容需要进行加密,后台需要的内容又是字符串,所以在原始的方式下,Alamofire进行传值都是字典,通过内部转换成字符串传到后台,这种方式不可取。
那么只能在数据传到后台前进行数据拦截,进行加密后在重新连接,传递到后台。
首先需要在封装的网络请求方法中实现RequestAdapter,RequestRetrier这两个协议。实现两个协议的方法:
adapt方法具体实现拦截后的操作然后进行重新连接

func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
        print("====")
        completion(true, 0)
    }
    
    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
//        throw AuthenticationError.expiredAccessToken
        
        var urlRes = urlRequest
        print("拦截数据---\(urlRequest)")
        if urlRequest.httpMethod == "GET" {
//            let url = urlRes.url?.absoluteString
//            let httpStr = url?.prefix(25)
//            let urlStr : String = String(url!.suffix(url!.count - 25))
//            let times = Global_Tools.requestCurrentTimeHM()
//            let newUrlStr = urlStr + "===\(times)"
//            let newUrl : String = httpStr! + Global_Tools.encrypotion(key: encryptionKey, content: newUrlStr)
//            print("加密后的url===\(newUrl)")
            urlRes.url = self.processingTheUrl(urlRes: urlRes) // URL(string: String(newUrl))
        }
        else if urlRequest.httpMethod == "POST" {
            print("post请求")
            let url = urlRes.url?.absoluteString
            if (url?.contains("https://itunes.apple.com"))! {
                print("请求苹果商店的地址")
            } else if (url?.contains(GXB_editPigeonry_Url))! {
                print("编辑鸽舍---" + GXB_editPigeonry_Url)
                urlRes.url = processingTheUrl(urlRes: urlRes)
            } else if (url?.contains(GXB_EditPigeon_Url))! {
                print("编辑赛鸽---" + GXB_EditPigeon_Url)
                urlRes.url = processingTheUrl(urlRes: urlRes)
            } else {
/// 获取httpBody,要传递到后台的参数
                let content = String(data: urlRes.httpBody!, encoding: .utf8)
                print("解析后的参数------\(content!)")
/// 对要传递到后台的参数进行加密
                let enContent = Global_Tools.encrypotion(key: encryptionKey, content: content!)
                print("加密后的解析参数---\(enContent)")
                urlRes.httpBody = enContent.data(using: .utf8)
                urlRes.url = processingTheUrl(urlRes: urlRes)
            }
        }
        return urlRes
    }

// MARK: 处理获取到的url,并进行加密
    func processingTheUrl(urlRes : URLRequest) -> URL {
        let url = urlRes.url?.absoluteString
        /// 获取到服务器地址
        let serverUrl = url?.prefix(Server_URL.count)
        print("请求地址---\(serverUrl!)")
        /// 获取到接口url
        let interfaceUrl : String = String(url!.suffix(url!.count - Server_URL.count))
        print("具体接口---\(interfaceUrl)")
        /// 当前时间戳
        let times = Global_Tools.requestCurrentTimeHM()
        print("当前时间戳----\(times)")
        /// 加密前url
        let beforeEncryptionUrl = interfaceUrl + "|~^\(times)"
        print("加密前的url---\(beforeEncryptionUrl)")
        /// 加密后url
        let encryptedUrl : String = serverUrl! + Global_Tools.encrypotion(key: encryptionKey, content: beforeEncryptionUrl)
        print("加密后的url===\(encryptedUrl)")
        return URL(string: String(encryptedUrl))!
    }

封装的网络方法需要实现两个协议,这里很容易理解,只是当时自己脑子抽筋,没过转过来,只是实现了上面的具体方法,没有具体到是谁要用这两个协议,所以一直不走,纠结了很久,希望遇到这个问题的同道中人,不要苦恼,哎,当局者迷啊!

let sessionManager = Alamofire.SessionManager(configuration: configuration)
        sessionManager.adapter = NetworkSessionManager()
        sessionManager.retrier = NetworkSessionManager()

相关文章

网友评论

      本文标题:Alamofire数据拦截并进行加密

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