4.處理網絡請求URLRequest

三個類:NetworkRequest處理網絡請求,JSONParse處理數據轉化,JSONRequest請求網絡數據并轉化
語言:Swift3.0
NetworkRequest

import UIKit

class NetworkRequest: NSObject {
    static func request(url:String, para:String?, result:@escaping (Data?, _ error:String?)->Void){
        if let tmpURL = URL(string:url) {
            var request = URLRequest(url: tmpURL)
            request.httpMethod = "POST"
            let sessionConfig = URLSessionConfiguration.default
            sessionConfig.timeoutIntervalForRequest = 20
            let session = URLSession(configuration: sessionConfig)
            let body = para?.data(using: String.Encoding.utf8)
            let task = session.uploadTask(with: request, from: body, completionHandler: {
                (data, response, error) ->Void in
                if error != nil {
                    result(nil, error!.localizedDescription)
                    return;
                }
                result(data, nil)
            })
            task.resume()
        }else{
            result(nil, "請求地址出錯")
        }
    }
}

數據相互轉化:json轉對象,對象轉json

import UIKit

class JSONParse: NSObject {
    /**
     對象轉成JSON數據
    **/
    static func toJSON(data:Any)->Data? {
        if JSONSerialization.isValidJSONObject(data) {
            do{
                let result = try JSONSerialization.data(withJSONObject: data, options: [])
                return result
            }catch{
                print("JOSN化失敗")
            }
        }
        return nil
    }
    /**
     JSON數據轉成對象
    **/
    static func toAny(json:Data)->Any?{
        do{
            let result = try JSONSerialization.jsonObject(with: json, options: [])
            return result
        }catch{
            print("轉化失敗")
        }
        return nil
    }
}

將兩個功能結合起來,獲取完json數據結果后轉為對象結果返回

import UIKit

class JSONRequest: NSObject {
    /**
     請求返回后將json數據轉化為對象數據
    **/
    static fileprivate var result:((Any?, _ error:String?)->Void)?
    static func jsonRequest(url:String, para:String, result:@escaping (Any?, _ error:String?)->Void)->Void{
        self.result = result
        NetworkRequest.request(url: url, para: para, result: requestResult)
    }
    static fileprivate func requestResult(data:Data?, error:String?)->Void{
        if data != nil {
            if let tmp = JSONParse.toAny(json: data!) {
                self.result?(tmp, error)
                return
            }else{
                self.result?(nil, "轉化失敗")
                return
            }
        }
        self.result?(nil, error)
    }
}

Example:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        JSONRequest.jsonRequest(url: "https://www.gn100.com/interface/login", para: "", result: {
            (data, error) in
            if error != nil {
                print(error!)
            }else{
                print(data!)
            }
        })
        print("ffff")
    }
}

源碼:https://github.com/ghyh22/NetworkRequest

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • AFHTTPRequestOperationManager 網絡傳輸協議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,403評論 0 12
  • iOS網絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,259評論 1 23
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,257評論 4 61
  • 轉載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 8,751評論 0 36