美文网首页
Moya 网络请求封装

Moya 网络请求封装

作者: 小王在努力 | 来源:发表于2020-11-10 18:37 被阅读0次

    1、前言

    任何网络请求主要由三部分构成
    a、域名 : 我们经常说的URL
    b、头参数 : 我们说的header
    c、body : 网络请求参数存放的地方

    2、定义一个枚举

    每一个请求方法一个枚举上代码
    public enum ApiMoya{
        //about user
        case login(username :String,password :String)
        //data upload
        case uploadVideo(data :Data)
    }
    

    3、创建一个文件

    该文件继承 TargetType并且实现 TargetType的协议

    extension ApiMoya : TargetType{
        public var baseURL: URL {
            switch self {
            case .uploadVideo:
                return URL(string: BaseMacro.apiUploadHost())!
            default:
                return URL(string: BaseMacro.apiHost())!
            }
        }
        public var task: Task {
            var params : [String : String] = [:]
            switch self {
            case let .login(username: username, password: password):
                params = ["username":username,"password":password]
                break
            case let .uploadVideo(data: data):
                let time = String().timeStamp
                let auto_key = "FoFHDov5mTn3OriLeE9u3loOnIL6tp7q" + time
                params = ["from":"6","uuid":BaseMacro.uuid()," time":time,"auth_key":auto_key.md5String]
                let formData: [Moya.MultipartFormData] = [Moya.MultipartFormData(provider: .data(data), name: "video", fileName: "video.mp4", mimeType: "video/mp4")]
                return .uploadCompositeMultipart(formData, urlParameters: params)
            default:
                break;
            }
            let code = ApiEncry.encodeData(params:params)
            return .requestParameters(parameters: code, encoding: URLEncoding.default)
        }
        public var path: String {
            switch self {
            case .login:
                return "cps/user/login"
            case .uploadVideo:
                return "video"
            }
        }
        public var method: Moya.Method {
            return .post
        }
        public var headers: [String : String]? {
            switch self {
            case .uploadVideo:
                return [:]//["Content-type" : "multipart/form-data"]
            default:
                return [:]
            }
        }
        public var sampleData: Data {
            return Data(base64Encoded: "just for test")!
        }
    

    注意

    a、baseURL :网络请求存放的域名
    b、task :网络请求的boday
    c、headers :网络请求的头参数
    d、method :网络请求的方式 POST、GET、PUT、DELETE
    e、path :一般是域名后名携带的参数比如域名是http://www.baidu.com 经常需要在域名后添加比如login ,http://www.baidu.com/login,这里path就是login,也可以为空
    f、sampleData :单元测试使用

    4、基于ApiMoya的封装

    extension ApiMoya{
        public static func request(target : ApiMoya,sucesss:@escaping ((_ object : JSON) ->()),failure:@escaping ((_ error : String) ->())){
            let moya = MoyaProvider<ApiMoya>()
            moya.request(target, callbackQueue: DispatchQueue.main, progress: nil) { (result) in
                switch result{
                case let .success(respond):do{
                    let json = JSON(respond.data)
                    sucesss(json)
                }
                case let .failure(error):do {
                    failure(error.errorDescription!)
                    break
                }
                }
            }
        }
    }
    

    5、方法的调用

    ApiMoya.request(target: .login(username: self.accountView.text!, password: self.pwdView.text!)) { (json) in
                    print(json)
     } failure: { (error) in
    
      }
    

    6、网络请求超时设置

    private let timeOut = { (endpoint: Endpoint, done: @escaping MoyaProvider<ApiMoya>.RequestResultClosure) in
        do {
            var request = try endpoint.urlRequest()
            request.timeoutInterval = 10
            done(.success(request))
        } catch {
            return
        }
    }
    

    只需要在4这一步调用就可以了,比如

    let moya = MoyaProvider<ApiMoya>(requestClosure:timeOut)
    

    相关文章

      网友评论

          本文标题:Moya 网络请求封装

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