?//baby請(qǐng)求
? ? casePostBabyParameters(pathStr:String,Babyparameters: [String:Any],URLparameters: [String:Any])
? ? //沒有參數(shù)
? ? caseGetNoParameters(pathStr:String)
? ? //有參數(shù)
? ? caseGetYesParameters(pathStr:String,parameters: [String:Any])
? ??casePostParameters(pathStr:String,parameters: [String:Any])
? ? //上傳頭像圖片
? ? caseuploadPortraitImage(pathStr:String,parameters: [String:Any],imageData:Data)
? ? //上傳文件
? ? caseuploadFileURL(pathStr:String,parameters: [String:Any],fileURL:URL)
JJNetWorkDemo github地址: ?Demo
//? JJNetWork.swift
//? JJNetWorkDemo
//? Created by IOS FOR Joe on 2022/4/22.
importUIKit
importFoundation
import Moya
//網(wǎng)絡(luò)請(qǐng)求
struct JJNetWork {
? ? // 請(qǐng)求成功的回調(diào)
? ? typealiassuccessCallback= (_ result:Any) -> Void
? ? //上傳進(jìn)度
? ? typealiasprogressCallback= (_ progress:Double) -> Void
? ? // 請(qǐng)求錯(cuò)誤的回調(diào)
? ? typealiaserrorCallback= (_ statusCode:Int) -> Void
? ? // 請(qǐng)求失敗的回調(diào)
? ? typealiasfailureCallback= (_ error: MoyaError) -> Void
? ? // 單例
? ? staticletprovider= MoyaProvider(plugins: [NetworkActivityPlugin{ (type,_)? in
? ? ? ? switchtype{
? ? ? ? case.began:
? ? ? ? ? ? print("顯示loading")
? ? ? ? case.ended:
? ? ? ? ? ? print("隱藏loading")
? ? ? ? }
? ? }])
? ? // 發(fā)送網(wǎng)絡(luò)請(qǐng)求
? ? static func request(
? ? ? ? target:JJService,
? ? ? ? success: @escaping successCallback,
? ? ? ? error1: @escaping errorCallback,
? ? ? ? failure: @escaping failureCallback
? ? ) {
? ? ? ? print("*****************************start ***********************")
? ? ? ? print("baseURL==\(target.baseURL)")
? ? ? ? print("path==\(target.path)")
? ? ? ? print("parameters==\(target.task)")
? ? ? ? provider.request(target) { resultin
? ? ? ? ? ? switchresult {
? ? ? ? ? ? caselet.success(moyaResponse):
? ? ? ? ? ? ? ? do{
? ? ? ? ? ? ? ? ? ? letdic =try! moyaResponse.mapJSON()as!NSDictionary
? ? ? ? ? ? ? ? ? ? let data = getJSONStringFromDictionary(dictionary:dic)
? ? ? ? ? ? ? ? ? ? print("======succeed data = \(dic)")
//? ? ? ? ? ? ? ? ? ? let model : APIModelJoe = APIModelJoe.deserialize(from: dic, designatedPath: "")!
//
//? ? ? ? ? ? ? ? ? ? let code : NSInteger = NSInteger(model.code )// dic["code"] as! NSInteger
//? ? ? ? ? ? ? ? ? ? if code == 200 {
//? ? ? ? ? ? ? ? ? ? ? ? //如果數(shù)據(jù)返回成功則直接將結(jié)果轉(zhuǎn)為JSON
//? ? ? ? ? ? ? ? ? ? ? ? try success(moyaResponse.mapJSON())
//? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }catchleterror{
? ? ? ? ? ? ? ? ? ? //服務(wù)器報(bào)錯(cuò)等問(wèn)題 (常見問(wèn)題404 ,地址錯(cuò)誤)
? ? ? ? ? ? ? ? ? ? error1((erroras!MoyaError).response!.statusCode)
//? ? ? ? ? ? ? ? ? ? if ProgressHUD.hud != nil{
//? ? ? ? ? ? ? ? ? ? ? ? ProgressHUD.hideHud()
//? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? caselet.failure(error):
? ? ? ? ? ? ? ? //沒有網(wǎng)絡(luò)等問(wèn)題 (網(wǎng)絡(luò)超時(shí),沒有網(wǎng))(必要時(shí)還可以將嘗試重新發(fā)起請(qǐng)求)
? ? ? ? ? ? ? ? failure(error)
//? ? ? ? ? ? ? ? if ProgressHUD.hud != nil{
//? ? ? ? ? ? ? ? ? ? ProgressHUD.hideHud()
//? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? print("*****************************end ***********************")
? ? ? ? }
? ? }
? ? /**
?? ? 字典轉(zhuǎn)換為JSONString
?? ? - parameter dictionary: 字典參數(shù)
?? ? - returns: JSONString
?? ? */
? ? static? func getJSONStringFromDictionary(dictionary:NSDictionary) -> String {
? ? ? ? if(!JSONSerialization.isValidJSONObject(dictionary)) {
? ? ? ? ? ? print("無(wú)法解析出JSONString")
? ? ? ? ? ? return""
? ? ? ? }
? ? ? ? letdata : NSData! =try? JSONSerialization.data(withJSONObject: dictionary, options: [])asNSData?
? ? ? ? letJSONString = NSString(data:dataasData,encoding:String.Encoding.utf8.rawValue)
? ? ? ? returnJSONString!asString
? ? }
? ? //上傳文件
? ? static func upload(
? ? ? ? target:JJService,
? ? ? ? progress:@escaping? progressCallback,
? ? ? ? success: @escaping successCallback,
? ? ? ? error1: @escaping errorCallback,
? ? ? ? failure: @escaping failureCallback){
? ? ? ? ? ? provider.request(target,callbackQueue:nil,progress: { (ProgressResponse)in
? ? ? ? ? ? ? ? progress(ProgressResponse.progress)
? ? ? ? ? ? }) { (result)in
? ? ? ? ? ? ? ? switchresult {
? ? ? ? ? ? ? ? caselet.success(moyaResponse):
? ? ? ? ? ? ? ? ? ? do{
? ? ? ? ? ? ? ? ? ? ? ? //如果數(shù)據(jù)返回成功則直接將結(jié)果轉(zhuǎn)為JSON
? ? ? ? ? ? ? ? ? ? ? ? trysuccess(moyaResponse.mapJSON())
? ? ? ? ? ? ? ? ? ? }catchleterror{
? ? ? ? ? ? ? ? ? ? ? ? //服務(wù)器報(bào)錯(cuò)等問(wèn)題 (常見問(wèn)題404 ,地址錯(cuò)誤)
? ? ? ? ? ? ? ? ? ? ? ? error1((erroras!MoyaError).response!.statusCode)
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? caselet.failure(error):
? ? ? ? ? ? ? ? ? ? //沒有網(wǎng)絡(luò)等問(wèn)題 (網(wǎng)絡(luò)超時(shí),沒有網(wǎng))(必要時(shí)還可以將嘗試重新發(fā)起請(qǐng)求)
? ? ? ? ? ? ? ? ? ? failure(error)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
}
// 定義請(qǐng)求方法
enum JJService {
? ? //baby請(qǐng)求
? ? casePostBabyParameters(pathStr:String,Babyparameters: [String:Any])
? ? //沒有參數(shù)
? ? caseGetNoParameters(pathStr:String)
? ? //有參數(shù)
? ? caseGetYesParameters(pathStr:String,parameters: [String:Any])
? ? casePostParameters(pathStr:String,parameters: [String:Any])
? ? //上傳頭像圖片
? ? caseuploadPortraitImage(pathStr:String,parameters: [String:Any],imageData: Data)
? ? //上傳文件
? ? caseuploadFileURL(pathStr:String,parameters: [String:Any],fileURL: URL)
}
extension JJService: TargetType {
? ? // 請(qǐng)求服務(wù)器的根路徑
? ? varbaseURL: URL {returnURL.init(string:BASE_SERVER_URL)!}
? ? // 每個(gè)API對(duì)應(yīng)的具體路徑
? ? varpath:String{
? ? ? ? switchself{
? ? ? ? case.PostBabyParameters(letpathStr,_):
? ? ? ? ? ? returnpathStr
? ? ? ? case.GetNoParameters(letpathStr):
? ? ? ? ? ? returnpathStr
? ? ? ? case.GetYesParameters(letpathStr, _):
? ? ? ? ? ? returnpathStr
? ? ? ? case.PostParameters(letpathStr, _):
? ? ? ? ? ? returnpathStr
? ? ? ? case.uploadPortraitImage(letpathStr, _, _):
? ? ? ? ? ? returnpathStr
? ? ? ? case.uploadFileURL(letpathStr, _, _):
? ? ? ? ? ? returnpathStr
? ? ? ? }
? ? }
? ? // 各個(gè)接口的請(qǐng)求方式,get或post
? ? varmethod: Moya.Method{
? ? ? ? switchself{
? ? ? ? case .PostBabyParameters:
? ? ? ? ? ? return.post
? ? ? ? case .GetNoParameters:
? ? ? ? ? ? return.get
? ? ? ? case .GetYesParameters:
? ? ? ? ? ? return.get
? ? ? ? case .PostParameters:
? ? ? ? ? ? return.post
? ? ? ? case .uploadPortraitImage:
? ? ? ? ? ? return.post
? ? ? ? case .uploadFileURL:
? ? ? ? ? ? return.post
? ? ? ? }
? ? }
? ? // 請(qǐng)求是否攜帶參數(shù),
? ? vartask:Task{
? ? ? ? switchself{
? ? ? ? case .GetNoParameters:
? ? ? ? ? ? return.requestPlain// 無(wú)參數(shù)
? ? ? ? case.GetYesParameters(_,letparameters):
? ? ? ? ? ? return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
? ? ? ? case.PostParameters(_,letparameters):// 帶有參數(shù),注意前面的let
? ? ? ? ? ? return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
? ? ? ? case.PostBabyParameters(_,letBabyparameters)://
? ? ? ? ? ? return .requestCompositeParameters(bodyParameters: Babyparameters, bodyEncoding: JSONEncoding.default, urlParameters: [:])
? ? ? ? ? ? //上傳頭像
? ? ? ? case.uploadPortraitImage(_, _,letimageData):
? ? ? ? ? ? print(imageData)
? ? ? ? ? ? letformData =MultipartFormData.init(provider:MultipartFormData.FormDataProvider.data(imageData),name:"pic",fileName:"pic.png",mimeType:"image/png")
? ? ? ? ? ? print(formData)
? ? ? ? ? ? letmultipartData = [formData]
? ? ? ? ? ? return.uploadMultipart(multipartData)
? ? ? ? case.uploadFileURL(_, _,letfileURL):
? ? ? ? ? ? return.uploadFile(fileURL)
? ? ? ? }
? ? }
? ? //是否執(zhí)行Alamofire驗(yàn)證
? ? publicvarvalidate:Bool{
? ? ? ? return false
? ? }
? ? //這個(gè)就是做單元測(cè)試模擬的數(shù)據(jù),只會(huì)在單元測(cè)試文件中有作用
? ? varsampleData: Data {
? ? ? ? switchself{
? ? ? ? case.PostBabyParameters(_,letbabyparameters):
? ? ? ? ? ? return"{\"parameters\": \(babyparameters)\"}".utf8Encoded
? ? ? ? case .GetNoParameters:
? ? ? ? ? ? return "just for test".utf8Encoded
? ? ? ? case.GetYesParameters(_,letparameters):
? ? ? ? ? ? return"{\"parameters\": \(parameters)\"}".utf8Encoded
? ? ? ? case.PostParameters(_,letparameters):
? ? ? ? ? ? return"{\"parameters\": \(parameters)\"}".utf8Encoded
? ? ? ? case.uploadPortraitImage(_,letparameters, _):
? ? ? ? ? ? return"{\"parameters\": \(parameters)\"}".utf8Encoded
? ? ? ? case.uploadFileURL(_,letparameters, _):
? ? ? ? ? ? return"{\"parameters\": \(parameters)\"}".utf8Encoded
? ? ? ? }
? ? }
? ? // 請(qǐng)求頭
? ? varheaders: [String:String]? {
? ? ? ? letuserDefault = UserDefaults.standard
? ? ? ? switchself{
? ? ? ? case .PostBabyParameters:
? ? ? ? ? ? return["adminToken":"\(userDefault.value(forKey:"token") ??"")","adminViewId":"\(userDefault.value(forKey:"viewId") ??"")","tenantId":"\(userDefault.value(forKey:"tenantId") ??"")","platform":"ios","Accept":"application/json"]
? ? ? ? case .GetNoParameters:
? ? ? ? ? ? return["adminToken":"\(userDefault.value(forKey:"token") ??"")","adminViewId":"\(userDefault.value(forKey:"viewId") ??"")","tenantId":"\(userDefault.value(forKey:"tenantId") ??"")","platform":"ios","Accept":"application/json"]
? ? ? ? case.GetYesParameters(_,_):
? ? ? ? ? ? return["adminToken":"\(userDefault.value(forKey:"token") ??"")","adminViewId":"\(userDefault.value(forKey:"viewId") ??"")","tenantId":"\(userDefault.value(forKey:"tenantId") ??"")","platform":"ios","Accept":"application/json"]
? ? ? ? case.PostParameters(_,_):
? ? ? ? ? ? return ["adminToken": "\(userDefault.value(forKey: "token") ?? "")","adminViewId": "\(userDefault.value(forKey: "viewId") ?? "")","tenantId": "\(userDefault.value(forKey: "tenantId") ?? "")","platform": "ios","Content-type" :"application/x-www-form-urlencoded"]
? ? ? ? case.uploadPortraitImage(_,_ , _):
? ? ? ? ? ? return ["adminToken": "\(userDefault.value(forKey: "token") ?? "")","adminViewId": "\(userDefault.value(forKey: "viewId") ?? "")","tenantId": "\(userDefault.value(forKey: "tenantId") ?? "")","platform": "ios","Content-type" :"application/json; charset=utf-8"]
? ? ? ? case.uploadFileURL(_,_, _):
? ? ? ? ? ? return ["adminToken": "\(userDefault.value(forKey: "token") ?? "")","adminViewId": "\(userDefault.value(forKey: "viewId") ?? "")","tenantId": "\(userDefault.value(forKey: "tenantId") ?? "")","platform": "ios","Content-type" :"application/json; charset=utf-8"]
? ? ? ? }
? ? }
}
// 擴(kuò)展方法
private extension String {
? ? varutf8Encoded: Data {
? ? ? ? returndata(using:String.Encoding.utf8)!
? ? }
}