在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()
网友评论