Swift网络请求(Moya篇)

  在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等。但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题。Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置。具体的介绍可以参考Moya的官方链接,结构图如下:

  接下来就介绍一下Moya的一些常见的用法:

(一)根据业务需求创建具体请求:

  打比方现在我们需要书写账户的相关接口,如Login、userInfo。那么首先我们得创建AccountService:

enum AccountService {
    case login(phoneNum: NSInteger,passWord: NSInteger)
    case logout
}

  然后让AccountService实现TargetType协议,定义请求需要的基本信息:

extension AccountService: TargetType {
    var baseURL: URL {
        return URL(string: ServiceBaseURL)!
    }

    var path: String {
        switch self {
        case .login(_, _):
            return "accountService/login"
        case .logout:
            return "accountService/logout"
        }
    }

    var method: Moya.Method {
        switch self {
        case .login(_, _):
            return .post
        case .logout:
            return .get
        }
    }

    var parameters: [String: Any]? {
        switch self {
        case .login(let phoneNum, let passWord):
            return ["phoneNum": phoneNum, "passWord": passWord]
        case .logout:
            return nil
        }
    }

    var parameterEncoding: ParameterEncoding {
        return JSONEncoding.default // Send parameters as JSON in request body
    }

    var sampleData: Data {
        return "".data(using: .utf8)!
    }

    var task: Task {
        return .request
    }

}

  如上我们就已经完成了网络请求所需要的一个endpoint。接着通过Moya提供一个发送请求的Provider就完成了基本的使用:

let provider = MoyaProvider<AccountService>()

provider.request(.login(phoneNum: 12345678901, passWord: 123456)) { result in
            switch result {
            case let .success(response):
                //...............
                break
            case let .failure(error):
                //...............
                break
            }
        }

(二)通过HTTPHeader设置公共请求参数

  在实际开发中我们可能会需要在请求头内添加一些公共请求参数,如用于识别一些平台标志、辨别接口的版本号。你可以定义一个Endpoint的闭包,

let publicParamEndpointClosure = { (target: AccountService) -> Endpoint<AccountService> in
            let url = target.baseURL.appendingPathComponent(target.path).absoluteString
            let endpoint = Endpoint<AccountService>(url: url, sampleResponseClosure: { .networkResponse(200, target.sampleData) }, method: target.method, parameters: target.parameters, parameterEncoding: target.parameterEncoding)
            return endpoint.adding(newHTTPHeaderFields: ["x-platform" : "iOS", "x-interface-version" : "1.0"])
        }

  然后在创建请求的Provider把它添加上去,

let provider = MoyaProvider(endpointClosure: publicParamEndpointClosure)

(三)通过插件的方式监听网络状态

  通常我们会在进行网络请求的时候进行一些状态展示,如loading,那么你可以通过插件的方式来实现。Moya默认有4个插件:

  • AccessTokenPlugin 管理AccessToken的插件
  • CredentialsPlugin 管理认证的插件
  • NetworkActivityPlugin 管理网络状态的插件
  • NetworkLoggerPlugin 管理网络log的插件

  在这里就演示一下NetworkActivityPlugin的使用:

let networkPlugin = NetworkActivityPlugin { (type) in
            switch type {
            case .began:
                NSLog("显示loading")
            case .ended:
                NSLog("隐藏loading")
            }
        }

  同样在创建请求的Provider把它添加上去即可

let provider = MoyaProvider<AccountService>(plugins: [networkPlugin])

  当然你也可以自定义一些功能的插件,只需要实现PluginType协议,具体功能实现可参考Moya默认的插件:

final class CustomPlugin: PluginType {

    // MARK: Plugin

}

(四)设置接口的超时时间

  一般网络的请求需要根据具体的业务接口设置合适的超时时间,你可以参照一下方法进行设置,

let requestTimeoutClosure = { (endpoint: Endpoint<AccountService>, done: @escaping MoyaProvider<AccountService>.RequestResultClosure) in

            guard var request = endpoint.urlRequest else { return }

            request.timeoutInterval = 30    //设置请求超时时间
            done(.success(request))
        }

  同样在创建请求的Provider把它添加上去即可

let provider = MoyaProvider<AccountService>(requestClosure: requestTimeoutClosure)

  至此,使用Moya进行网络请求的基本用法已经介绍完了,主要是记录一下只是药店,当然也希望能对大家有点用处,谢谢!

资料参考:

http://www.jianshu.com/p/38fbc22a1e2b

https://github.com/Moya/Moya

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "PingFang SC"; color: #ffffff }
span.s1 { color: #c2349b }
span.s2 { }
span.s3 { color: #00afca }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "PingFang SC"; color: #00afca }
span.s1 { }

时间: 2024-11-08 22:32:54

Swift网络请求(Moya篇)的相关文章

Swift 网络请求数据与解析

一: Swift 网络数据请求与处理最常用第三方 又有时间出来装天才了,还是在学swift,从中又发现一些问题,这两天上网找博客看问题弄的真的心都累.博客一篇写出来,好多就直接照抄,就没有实质性的把问题解决了,只是在发表的博客数量上 + 1 !!真心没意思.. 看看在Swift中是在怎样请求数据,解析数据加载图片这些的,也使我们最基本最常见的用法了,先说说这几个三方库: 第一个: Alamofire  (它的原作者就是AFNetworking的原作者,这个就不多说了,你要知道AFNetworki

swift 网络请求&amp;json解析

做实际项目总是离不开这两步,大多数情况下都是采用第三方框架来辅助完成,swift也不例外,由于swift并不成熟,用swift语言写的第三方框架很不稳定(苹果更新太快了),所幸swift和oc可以混编,所以本次使用的框架都是oc里面常用的.网络请求使用AFNetworking,json解析使用MJExtension. 下面开始正文: 1. swift中使用oc框架 其原理很简单,需要一个.h头文件,里面导入我们需要使用的oc框架的头文件,把这个.h文件配置到项目设置中即可 1).我们采取一个不容

Swift - 网络请求报App Transport Security has blocked a cleartext错

使用Xcode7编写iOS9应用时,如果获取http://数据时会报如下错误: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. 原因: 从iOS9起,新特性要求App访问网络请求,要采用 HTTPS 协议. 如

IOS SWIFT 网络请求JSON解析 基础一

前言:移动互联网时代,网络通信已经是手机端必不可少的功能.应用中也必不可少地使用了网络通信,增强客户端与服务器交互.使用NSURLConnection实现HTTP的通信.NSURLConnection 提供了异步请求和同步请求两种通信方式.同步请求数据会造成主线程阻塞,通常在请求大数据或网络不通畅时不建议使用. 不管同步请求还是异步请求,建立通信的步骤是一样的: 1 创建NSURL 2 创建NSURLRequest 3 创建NSURLConnection 当NSURLConnection 创建成

Swift教程16-使用Swift调用AFNetworking进行网络请求

如何使用Swift进行网络请求呢? 我们首先创建一个Swift工程,工程名是SwiftDemo 然后在该工程中新建一个 Oc的类,那么Xcode会询问你是否创建 桥接 Oc和 Swift的 SwiftDemo-Bridging-Header.h文件 选择YES就会生成 工程名-Bridging-Header.h文件,在这个文件中我们引入Oc框架对应的头文件即可实现在Swift工程中调用Oc代码 目前的AFNetworking框架是Oc写的,我们要在Swift使用AF的话,则需要在 Bridgin

iOS开发——实战篇Swift篇&amp;UItableView结合网络请求,多线程,数据解析,MVC实战

UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高级知识:网络请求,JSON数据解析一起应用到一个项目中来. 好了,废话不多说,我们直接开始吧. 首先看看最终的效果: 是不是很简单,就是个UItableView显示一些简单的数据,如果你真的觉得太简单了,那么请绕道,寻找更深入东西,但或者没有你想的那么简单,这不仅仅是一个tableView,为什么呢

【Swift】Alamofile网络请求数据更新TableView的坑

写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的回答, 而唯一几个比较接近答案的,说要 self.tableView.reloadData(),也没有贴上代码,说要放在哪个函数内, 都犹抱琵琶半遮面,让初学者自己采坑,于是郁闷了一下午,刚刚回到家,试想想,要不试试英文网,毕竟Swift就是人家老外的, 说不定老外会告诉你,怎么取得数据并绑定Tab

Swift-网络请求(http)的基础学习

swift发起网络请求自然有他自己的处理类NSURLRequest.这个跟android中httpClient的作用都是一样的.因此本篇博客只是记录一下这个过程,代码比较简单. import UIKit protocol HttpProtocol{ func didRecieveResults(results:NSDictionary) } class HttpController: NSObject { var delegate:HttpProtocol? func onSearch(url:

swift网络数据请求方法

搭建一个apache服务器,用php编写一个返回给客户端请求数据的脚本 1 <?php 2 // header("Content-type:text/html;charset=utf-8"); 3 header("Content-type:text/json;charset=utf-8"); 4 if (isset($_REQUEST['name'])) { 5 $result = $_REQUEST['name']; 6 $arr=array("r