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,837评论 18 139
  • AFHTTPRequestOperationManager 网络传输协议UDP、TCP、Http、Socket、X...
    Carden阅读 4,375评论 0 12
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,237评论 1 23
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,188评论 4 61
  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子阅读 8,668评论 0 36