美文网首页
Swift Moya网络请求库的学习认识和简单使用

Swift Moya网络请求库的学习认识和简单使用

作者: yangluDDD | 来源:发表于2019-06-28 18:24 被阅读0次

    Moya是Swift中的网络库Alamofire的二次封装,Alamofire本身使用起来是很简单方便的,例子如下:

    Alamofire请求

    Moya的优缺点:

    (1)在我们项目的 Service、View、或者 Model 文件中可能都会出现请求网络数据的情况,如果直接使用 Alamofire,不仅很繁琐,而且还会使代码变得很混乱。

    (2)过去我们通常的做法是在项目中添加一个网络请求层(比如叫做 APIManager,用来管理网络请求。但这样做可能会遇到一些问题:

    多人开发的时候很难降低耦合度

    难以维护现有的 App(这一层比较混乱,混合了各种请求不好管理。)

    难以做做单元测试。

    (3)而 Moya 作为一个基于 Alamofire 的更高层网络请求封装抽象层,拥有更好更清晰的网络管理。不仅可以轻松实现简单的事情,而且是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置。它有如下优点:

    定义了一个清晰的网络结构(通过枚举值定义不同的请求)

    多人开发的时候降低耦合度

    可以简单地进行网络单元测试

    结构图如下:

    moya结构图

    那么Moya如何使用呢?

    1、首先创建一个swift文件,创建一个枚举,定义三个请求,如下:

    /*

     封装的moya请求管理类

     */

    enum HttpRequest {

        case showHome(channnel:String , pn:Int)//列表数据请求,带有相关值的枚举,

        case indexHome//不带参数的请求

    }

    枚举中包含两个请求,分别是请求列表数据(附带参数)和一个不带参数的请求。

    2、创建扩展,遵循协议实现协议的方法,如下:

    /*

     遵循mayo协议,实现方法

     */

    extension HttpRequest : TargetType{

       //服务器地址

        var baseURL:URL{

            return URL(string:"http://www.inquireb2b.com/api/")!

        }

        //各个请求的具体路径

        var path:String{

            switch self{

            case .showHome(let channnel,let pn) : 

                return "introduction.php?page=\(pn)"

            case .indexHome :return"/index.php"

            }

        }

    //请求参数

     var parameters: [String:Any]? {

            switch self {

            case .showHome(let channnel,let pn):

                return ["channnel": channnel,"page":pn]

            case .indexHome:

                return nil

            }

        }

        //请求方式

        var method:Moya.Method{

            return .post

        }

    // 请求头

        public var headers: [String:String]? {

    //        return ["Content-Type" : "application/x-www-form-urlencoded; charset=utf-8"]

            return nil

        }

    // 这个就是做单元测试模拟的数据,只会在单元测试文件中有作用

        public var sampleData:Data{

            return "{}".data(using:String.Encoding.utf8)!

        }

        //请求任务事件(这里附带上参数)

        var task:Task{

            switch self{

                case .showHome(_,_):

                    return .requestParameters(parameters:parameters!, encoding:URLEncoding.default)

                default:

                    //不需要传参数的走这里

                    return  .requestPlain

                }

        }

    }

    这里通过TargetType协议的方法,设置了baseURL,请求方式和和参数,以及请求头等各个请求的参数。

    3、发起网络请求

    在需要的地方,调用网络管理类发起三个请求中的一个,这里以第一个为例,代码如下:

     func loadDataWithMoya(channnel:String, pn:Int) -> () {

            let provide = MoyaProvider()

            provide.request(.shujuList(channnel:channnel, pn: pn)) { Resultin

                switch Result {

                case let.success(response):

                    //数据解析

                    let json = JSON(response.data)

                    print(json)

                case let.failure(error):

                    print(error)

                }

            }

        }

    需要注意的是,Moya默认回传的是二进制的裸数据,需要自己进行解析,我使用了SwiftyJSON进行了解析。如果要进行模型转换的话推荐系统自带的Codable。

    相关文章

      网友评论

          本文标题:Swift Moya网络请求库的学习认识和简单使用

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