Swift-网络请求

作者: 逾期的誓言 | 来源:发表于2018-08-16 10:32 被阅读1210次

    我的驿站
    常用网络请求的三种方式,使用AFNetworking请求,与OC相比只是语法不同;使用Alamofire,采用链式编程的思想,与AFN是统一团队开发;而Moya是对Alamofire的高度封装,使用简单(推荐)

    AFNetworking

    cocoapods导入AFNetworking,创建桥接文件,#import "AFNetworking.h",
    创建NetworkManager继承至AFHTTPSessionManager。

    import UIKit
    // 枚举 (可以是任意类型)
    enum NetworkMethod {
        case GET
        case POST
    }
    class NetworkManager: AFHTTPSessionManager {
        // 创建单利 (计算型属性)
        static var sharedManager: NetworkManager {
            let tool = NetworkManager()
            tool.responseSerializer.acceptableContentTypes?.insert("application/json")
            tool.requestSerializer.timeoutInterval = 10
            return tool
        }
    }
    extension NetworkManager{
        // 设置默认get请求
        func request(method: NetworkMethod = .GET ,urlString: String,parameters: Any?,requestSuccess:@escaping (_ json: Any?)->(),requestFailure:@escaping (_ error: Error)->()) {
            // 定义闭包
            let success = {(task: URLSessionDataTask, json: Any)->() in
                requestSuccess(json)
            }
            let failure = {(tasks: URLSessionDataTask?, error: Error)->() in
                requestFailure(error)
            }
            if method == .GET {
                get(urlString, parameters: parameters, progress:nil, success: success, failure: failure)
            }
            if method == .POST {
                post(urlString, parameters: parameters, progress: nil, success: success, failure: failure);
            }
        }
    }
    

    使用方式

        func AFNetworkingRequest() {
            NetworkManager.sharedManager.request(method: .GET, urlString: "https://httpbin.org/get", parameters: nil, requestSuccess: { (responseObject) in
                print("AFN网络请求成功: \(responseObject ?? "")")
            }) { (error) in
                print("AFN网络请求失败: \(error)")
            }
    
    

    Alamofire

    cocoapods导入Alamofire;完全是用swift语言写的,使用方式有很多种,通常会自己简单封装个工具类,这里只是简单介绍下

        func AlamofireGetRequest() {
            Alamofire.request("https://httpbin.org/get", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
                if (response.error == nil){
                    print("Alamofire请求成功:\(response.result.value ?? "")")
                }else{
                    print("Alamofire请求失败:\(response.error ?? "" as! Error)")
                }
            }
        }
        func AlamofirePostRequest() {
            let dic: [String: String] = ["key1": "value1"] // 参数
            // JSONEncoding.prettyPrinted 是提交json
            Alamofire.request("https://httpbin.org/post", method: .post, parameters: dic, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
                if response.error == nil {
                    print("Post 请求成功:\(response.result.value ?? "")")
                }else{
                    print("Post 请求失败:\(response.error ?? "" as! Error)")
                }
            }
        }
    
    

    Moya

    • 首先我们定义一个 provider,即请求发起对象。往后我们如果要发起网络请求就使用这个 provider。
    • 接着声明一个 enum 来对请求进行明确分类,这里我们定义两个枚举值分别表示获取频道列表、获取歌曲信息。
    • 最后让这个 enum 实现 TargetType 协议,在这里面定义我们各个请求的 url、参数、header 等信息。
    import Foundation
    import Moya
     
    //初始化豆瓣FM请求的provider
    let DouBanProvider = MoyaProvider<DouBan>()
     
    /** 下面定义豆瓣FM请求的endpoints(供provider使用)**/
     
    //请求分类
    public enum DouBan {
        case channels  //获取频道列表
        case playlist(String) //获取歌曲
    }
     
    //请求配置
    extension DouBan: TargetType {
        //服务器地址
        public var baseURL: URL {
            switch self {
            case .channels:
                return URL(string: "https://www.douban.com")!
            case .playlist(_):
                return URL(string: "https://douban.fm")!
            }
        }
         
        //各个请求的具体路径
        public var path: String {
            switch self {
            case .channels:
                return "/j/app/radio/channels"
            case .playlist(_):
                return "/j/mine/playlist"
            }
        }
         
        //请求类型
        public var method: Moya.Method {
            return .get
        }
         
        //请求任务事件(这里附带上参数)
        public var task: Task {
            switch self {
            case .playlist(let channel):
                var params: [String: Any] = [:]
                params["channel"] = channel
                params["type"] = "n"
                params["from"] = "mainsite"
                return .requestParameters(parameters: params,
                                          encoding: URLEncoding.default)
            default:
                return .requestPlain
            }
        }
         
        //是否执行Alamofire验证
        public var validate: Bool {
            return false
        }
         
        //这个就是做单元测试模拟的数据,只会在单元测试文件中有作用
        public var sampleData: Data {
            return "{}".data(using: String.Encoding.utf8)!
        }
         
        //请求头
        public var headers: [String: String]? {
            return nil
        }
    }
    

    使用

        //使用我们的provider进行网络请求(获取频道列表数据)
            DouBanProvider.request(.channels) { result in
                if case let .success(response) = result {
                    //解析数据
                    let data = try? response.mapJSON()
                    let json = JSON(data!)
                    self.channels = json["channels"].arrayValue
                     
                    //刷新表格数据
                    DispatchQueue.main.async{
                        self.tableView.reloadData()
                    }
                }
            }
    

    相关文章

      网友评论

        本文标题:Swift-网络请求

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