Swift-網(wǎng)絡請求

我的驛站
常用網(wǎng)絡請求的三種方式,使用AFNetworking請求庙曙,與OC相比只是語法不同空镜;使用Alamofire,采用鏈式編程的思想捌朴,與AFN是統(tǒng)一團隊開發(fā)吴攒;而Moya是對Alamofire的高度封裝,使用簡單(推薦)

AFNetworking

cocoapods導入AFNetworking砂蔽,創(chuàng)建橋接文件洼怔,#import "AFNetworking.h",
創(chuàng)建NetworkManager繼承至AFHTTPSessionManager左驾。

import UIKit
// 枚舉 (可以是任意類型)
enum NetworkMethod {
    case GET
    case POST
}
class NetworkManager: AFHTTPSessionManager {
    // 創(chuàng)建單利 (計算型屬性)
    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網(wǎng)絡請求成功: \(responseObject ?? "")")
        }) { (error) in
            print("AFN網(wǎng)絡請求失敗: \(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"] // 參數(shù)
        // 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,即請求發(fā)起對象帆吻。往后我們如果要發(fā)起網(wǎng)絡請求就使用這個 provider域那。
  • 接著聲明一個 enum 來對請求進行明確分類,這里我們定義兩個枚舉值分別表示獲取頻道列表猜煮、獲取歌曲信息次员。
  • 最后讓這個 enum 實現(xiàn) TargetType 協(xié)議,在這里面定義我們各個請求的 url友瘤、參數(shù)翠肘、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
    }
     
    //請求任務事件(這里附帶上參數(shù))
    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
        }
    }
     
    //是否執(zhí)行Alamofire驗證
    public var validate: Bool {
        return false
    }
     
    //這個就是做單元測試模擬的數(shù)據(jù)辫秧,只會在單元測試文件中有作用
    public var sampleData: Data {
        return "{}".data(using: String.Encoding.utf8)!
    }
     
    //請求頭
    public var headers: [String: String]? {
        return nil
    }
}

使用

    //使用我們的provider進行網(wǎng)絡請求(獲取頻道列表數(shù)據(jù))
        DouBanProvider.request(.channels) { result in
            if case let .success(response) = result {
                //解析數(shù)據(jù)
                let data = try? response.mapJSON()
                let json = JSON(data!)
                self.channels = json["channels"].arrayValue
                 
                //刷新表格數(shù)據(jù)
                DispatchQueue.main.async{
                    self.tableView.reloadData()
                }
            }
        }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市被丧,隨后出現(xiàn)的幾起案子盟戏,更是在濱河造成了極大的恐慌,老刑警劉巖甥桂,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柿究,死亡現(xiàn)場離奇詭異,居然都是意外死亡黄选,警方通過查閱死者的電腦和手機蝇摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門婶肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人貌夕,你說我怎么就攤上這事律歼。” “怎么了啡专?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵险毁,是天一觀的道長。 經常有香客問我们童,道長畔况,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任慧库,我火速辦了婚禮跷跪,結果婚禮上,老公的妹妹穿的比我還像新娘齐板。我一直安慰自己吵瞻,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布覆积。 她就那樣靜靜地躺著听皿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宽档。 梳的紋絲不亂的頭發(fā)上尉姨,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音吗冤,去河邊找鬼又厉。 笑死,一個胖子當著我的面吹牛椎瘟,可吹牛的內容都是我干的覆致。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼肺蔚,長吁一口氣:“原來是場噩夢啊……” “哼煌妈!你這毒婦竟也來了?” 一聲冷哼從身側響起宣羊,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤璧诵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仇冯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體之宿,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年苛坚,在試婚紗的時候發(fā)現(xiàn)自己被綠了比被。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片色难。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖等缀,靈堂內的尸體忽然破棺而出枷莉,到底是詐尸還是另有隱情,我是刑警寧澤项滑,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布依沮,位于F島的核電站,受9級特大地震影響枪狂,放射性物質發(fā)生泄漏危喉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一州疾、第九天 我趴在偏房一處隱蔽的房頂上張望辜限。 院中可真熱鬧,春花似錦严蓖、人聲如沸薄嫡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毫深。三九已至,卻和暖如春毒姨,著一層夾襖步出監(jiān)牢的瞬間哑蔫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工弧呐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闸迷,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓俘枫,卻偏偏與公主長得像腥沽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸠蚪,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容