Swift 网络请求库Moya的使用

本文介绍了如何使用Moya网络库简化Swift项目中的网络请求管理。Moya基于Alamofire,提供了一个清晰的网络请求结构,并简化了单元测试过程。文章详细展示了如何定义请求枚举、配置请求参数以及发起网络请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

func loadData(){
        var param = [String:String]()
        param["pageNo"] = "1"
        param["Type"] = "8"
        param["pageSize"] = "10"

        Alamofire.request("https://www.baidu.com",parameters:param).responseJSON { (responseJson) in
            switch responseJson.result {
            case .success(let data):
                print(data)
                //Alamofire默认返回的是一个解析过的数据结构,这里代表一个字典
                if data is Dictionary<String, Any>{
                    let data2 = data as! Dictionary<String, Any>
                    print(data2["Msg"]!)
                }
            case .failure(let error):
                print(error)
            }
        }
    }

Moya的优缺点:

(1)在我们项目的 Service、View、或者 Model 文件中可能都会出现请求网络数据的情况,如果直接使用 Alamofire,不仅很繁琐,而且还会使代码变得很混乱。
(2)过去我们通常的做法是在项目中添加一个网络请求层(比如叫做 APIManager、或者 NetworkModel),用来管理网络请求。但这样做可能会遇到一些问题:
难以开发一个新的 App(不知从哪里下手)
难以维护现有的 App(这一层比较混乱,混合了各种请求不好管理。)
难以做做单元测试。
(3)而 Moya 作为一个基于 Alamofire 的更高层网络请求封装抽象层,拥有更好更清晰的网络管理。不仅可以轻松实现简单的事情,对于复杂的情况也轻松应对。它有如下优点:
定义了一个清晰的网络结构(通过枚举值定义不同的请求)
可以简单地进行网络单元测试

Moya的使用方法

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

/*
 封装的moya请求管理类
 */
enum HttpRequest {
    case shujuList(channnel:String , pn:Int , ps:Int) //列表数据请求,带有相关值的枚举,
    case othetRequest(str:String) //带一个参数的请求
    case otherRequest2 //不带参数的请求
}

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

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

/*
 遵循mayo协议,实现方法
 */
extension HttpRequest : TargetType{

    //服务器地址
    var baseURL: URL {
        return URL(string:"www.baidu.com")!
    }

    //各个请求的具体路径
    var path: String {
        switch self {
        case .shujuList:
            return "ArticleList"
        case .othetRequest:
            return "someOtherPath"
        default:
            return ""
        }
    }

    //请求方式
    var method: Moya.Method {
        return .get
    }

     //请求任务事件(这里附带上参数)
    var task: Task {
        var param:[String:Any] = [:]

        switch self {
        case let .shujuList(channel , pn , ps):
            param["Type"] = channel
            param["pageNo"] = pn
            param["pageSize"] = ps
        case let .othetRequest(str):
            param["str"] = str
        default:
            //不需要传参数的走这里
            return .requestPlain
        }
        return .requestParameters(parameters: param, encoding: URLEncoding.default)

    }

    //是否执行Alamofire验证
    public var validate: Bool {
        return false
    }

    //这个就是做单元测试模拟的数据,只会在单元测试文件中有作用
    public var sampleData: Data {
        return "{}".data(using: String.Encoding.utf8)!
    }

    //设置请求头
    public var headers: [String: String]? {
        return nil
    }
}

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

3、发起网络请求

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

func loadDataWithMoya(pn:Int , ps:Int) -> () {
    let provide = MoyaProvider<HttpRequest>()
    provide.request(.shujuList(channnel: "8", pn: pn, ps: ps)) { Result in
        switch Result {
        case let .success(response):
            //数据解析
            let json = JSON(response.data)
            print(json)

        case let .failure(error):
            print(error)
        }
    }
}

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

Moya参考博客
SwiftyJSON参考博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值