• Swift3.0:Get/Post同步和异步请求


    一、介绍

    Get和Post区别:

    • Get是从服务器上获取数据,Post是向服务器发送数据。
    • 对于Get方式,服务端用Request.QueryString获取变量的值,对于Post方式,服务端用Request.From获取提交的数据。
    • Get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内的各个字段一一对应。
    • Post是通过HTTP Post机制,将表单内各个字段和其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    • Get安全性非常低,Post安全性较高;但是Get方式的执行效率比Post方法好。
    • Get方式的安全性较Post方式差些,若包含机密信息,则建议用Post数据提交方式。
    • 在数据查询时,建议用Get方式;在做数据添加、删除、修改时,建议用Post方式。

    缓存策略:

     public enum CachePolicy : UInt {
     
         case useProtocolCachePolicy //基础策略
    
         case reloadIgnoringLocalCacheData //忽略本地存储
         
         case reloadIgnoringLocalAndRemoteCacheData // 忽略本地和远程存储,总是从原地址下载
    
         case returnCacheDataElseLoad //首先使用缓存,如果没有就从原地址下载
         
         case returnCacheDataDontLoad //使用本地缓存,从不下载,如果没有本地缓存,则请求失败,此策略多用于离线操作
         
         case reloadRevalidatingCacheData // 若本地缓存是有效的则不下载,其他任何情况总是从原地址下载
     }

    二、示例

    Get同步请求:

    //MARK: - 同步Get方式
     func synchronousGet(){
         
         // 1、创建URL对象;
         let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty");
            
         // 2、创建Request对象
         // url: 请求路径
         // cachePolicy: 缓存协议
         // timeoutInterval: 网络请求超时时间(单位:秒)
         let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
         // 3、响应对象
         var response:URLResponse?
            
         // 4、发出请求
         do {
                
             let received =  try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response)
             let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments)
             print(dic)
                
             //let jsonStr = String(data: received, encoding:String.Encoding.utf8);
             //print(jsonStr)
                
            } catch let error{
                print(error.localizedDescription);
            }
        }

    Get异步请求:

    //在控制器定义全局的可变data,用户存储接收的数据
    var jsonData:NSMutableData = NSMutableData()
    //MARK: - 异步Get方式
    func asynchronousGet(){
            
       // 1、创建URL对象;
       let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty");
            
       // 2、创建Request对象
       // url: 请求路径
       // cachePolicy: 缓存协议
       // timeoutInterval: 网络请求超时时间(单位:秒)
       let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
       // 3、连接服务器
       let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self)
       connection?.schedule(in: .current, forMode: .defaultRunLoopMode)
       connection?.start()
    }
    // MARK - NSURLConnectionDataDelegate
    extension GetPostViewController:NSURLConnectionDataDelegate{
        
        func connection(_ connection: NSURLConnection, didReceive response: URLResponse) {
            
            //接收响应
        }
        
        func connection(_ connection: NSURLConnection, didReceive data: Data) {
            
            //收到数据
            self.jsonData.append(data);
        }
        
        func connectionDidFinishLoading(_ connection: NSURLConnection) {
            //请求结束
            //let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8);
            //print(jsonStr)
            do {
                let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments)
                print(dic)
            } catch let error{
                print(error.localizedDescription);
            }
        }
    }

    Post同步请求:

    //MARK: - 同步Post方式
    func synchronousPost() {
         
        // 1、创建URL对象;
        let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews");
            
        // 2、创建Request对象
        // url: 请求路径
        // cachePolicy: 缓存协议
        // timeoutInterval: 网络请求超时时间(单位:秒)
        var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
         // 3、设置请求方式为POST,默认是GET
         urlRequest.httpMethod = "POST"
            
         // 4、设置参数
         let str:String = "type=beauty"
         let data:Data = str.data(using: .utf8, allowLossyConversion: true)!
         urlRequest.httpBody = data;
            
         // 5、响应对象
         var response:URLResponse?
            
         // 6、发出请求
         do {
                
             let received =  try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response)
              let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments)
              print(dic)
                
               //let jsonStr = String(data: received, encoding:String.Encoding.utf8);
               //print(jsonStr)
                
            } catch let error{
                print(error.localizedDescription);
            }
      }

    Post异步请求:

    //在控制器定义全局的可变data,用户存储接收的数据
    var jsonData:NSMutableData = NSMutableData()
    //MARK: - 异步Post方式
    func asynchronousPost(){
            
       // 1、创建URL对象;
       let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews");
            
       // 2、创建Request对象
       // url: 请求路径
       // cachePolicy: 缓存协议
       // timeoutInterval: 网络请求超时时间(单位:秒)
       var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
        // 3、设置请求方式为POST,默认是GET
        urlRequest.httpMethod = "POST"
            
        // 4、设置参数
        let str:String = "type=beauty"
        let data:Data = str.data(using: .utf8, allowLossyConversion: true)!
        urlRequest.httpBody = data;
            
        // 5、连接服务器
        let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self)
         connection?.schedule(in: .current, forMode: .defaultRunLoopMode)
         connection?.start()
    }
    // MARK - NSURLConnectionDataDelegate
    extension GetPostViewController:NSURLConnectionDataDelegate{
        
        func connection(_ connection: NSURLConnection, didReceive response: URLResponse) {
            
            //接收响应
        }
        
        func connection(_ connection: NSURLConnection, didReceive data: Data) {
            
            //收到数据
            self.jsonData.append(data);
        }
        
        func connectionDidFinishLoading(_ connection: NSURLConnection) {
            //请求结束
            //let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8);
            //print(jsonStr)
            do {
                let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments)
                print(dic)
            } catch let error{
                print(error.localizedDescription);
            }
        }
    }

    三、解析结果

    {
        body =     (
                    {
                cThumbnail = "http://d.ifengimg.com/w166_h120/p2.ifengimg.com/ifengiclient/ipic/2017040117/swoole_location_8b6bbc5951ce5734d8f4a623f594f4ee_4245440126_size203_w1000_h1500.jpg";
                cid = 1;
                comments = 0;
                commentsUrl = "http://share.iclient.ifeng.com/news/sharenews.f?&fromType=spider&aid=301341";
                commentsall = 0;
                content = "";
                ctime = "2017-04-01 17:30:01";
                id = "shortNews_301341";
                img =             (
                                    {
                        size =                     {
                            height = 720;
                            width = 480;
                        };
                        url = "http://d.ifengimg.com/mw480/p2.ifengimg.com/ifengiclient/ipic/2017040117/swoole_location_8b6bbc5951ce5734d8f4a623f594f4ee_4245440126_size203_w1000_h1500.jpg";
                    }
                );
                likes = 86;
                link =             {
                    type = shortNews;
                    url = "http://api.iclient.ifeng.com/clientShortNewsDetail?id=301341";
                };
                praise = 9284;
                shareTitle = "U51e4U51f0U65b0U95fbU7f8eU5973U56feU7247";
                shareUrl = "http://share.iclient.ifeng.com/news/sharenews.f?&fromType=spider&aid=301341";
                source = "";
                staticImg = "";
                status = 1;
                thumbnail = "http://d.ifengimg.com/w166/p2.ifengimg.com/ifengiclient/ipic/2017040117/swoole_location_8b6bbc5951ce5734d8f4a623f594f4ee_4245440126_size203_w1000_h1500.jpg";
                title = "U51e4U51f0U65b0U95fbU7f8eU5973U56feU7247";
                tread = 738;
                type = shortNews;
                utime = "2017-04-01 17:30:01";
            },
                    {
            ..............
            ..............
            ..............
    }

    四、完整代码

    //
    //  GetPostViewController.swift
    //  NetWorkTest
    //
    //  Created by 夏远全 on 2017/4/3.
    //  Copyright © 2017年 夏远全. All rights reserved.
    //
    
    import UIKit
    
    class GetPostViewController: UIViewController {
    
        //在控制器定义全局的可变data,用户存储接收的数据
        var jsonData:NSMutableData = NSMutableData()
        
        override func viewDidLoad() {
            super.viewDidLoad()
        }
        
    //========================================Get==========================================//
        
        //MARK: - 同步Get方式
        func synchronousGet(){
         
            // 1、创建URL对象;
            let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty");
            
            // 2、创建Request对象
            // url: 请求路径
            // cachePolicy: 缓存协议
            // timeoutInterval: 网络请求超时时间(单位:秒)
            let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
            // 3、响应对象
            var response:URLResponse?
            
            // 4、发出请求
            do {
                
                let received =  try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response)
                let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments)
                print(dic)
                
                //let jsonStr = String(data: received, encoding:String.Encoding.utf8);
                //print(jsonStr)
                
            } catch let error{
                print(error.localizedDescription);
            }
        }
        
        //MARK: - 异步Get方式
        func asynchronousGet(){
            
            // 1、创建URL对象;
            let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews?type=beauty");
            
            // 2、创建Request对象
            // url: 请求路径
            // cachePolicy: 缓存协议
            // timeoutInterval: 网络请求超时时间(单位:秒)
            let urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
            // 3、连接服务器
            let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self)
            connection?.schedule(in: .current, forMode: .defaultRunLoopMode)
            connection?.start()
        }
        
        
    //========================================Post==========================================//
        
        //MARK: - 同步Post方式
        func synchronousPost() {
         
            // 1、创建URL对象;
            let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews");
            
            // 2、创建Request对象
            // url: 请求路径
            // cachePolicy: 缓存协议
            // timeoutInterval: 网络请求超时时间(单位:秒)
            var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
            // 3、设置请求方式为POST,默认是GET
            urlRequest.httpMethod = "POST"
            
            // 4、设置参数
            let str:String = "type=beauty"
            let data:Data = str.data(using: .utf8, allowLossyConversion: true)!
            urlRequest.httpBody = data;
            
            // 5、响应对象
            var response:URLResponse?
            
            // 6、发出请求
            do {
                
                let received =  try NSURLConnection.sendSynchronousRequest(urlRequest, returning: &response)
                let dic = try JSONSerialization.jsonObject(with: received, options: JSONSerialization.ReadingOptions.allowFragments)
                print(dic)
                
                //let jsonStr = String(data: received, encoding:String.Encoding.utf8);
                //print(jsonStr)
                
            } catch let error{
                print(error.localizedDescription);
            }
        }
        
        //MARK: - 异步Post方式
        func asynchronousPost(){
            
            // 1、创建URL对象;
            let url:URL! = URL(string:"http://api.3g.ifeng.com/clientShortNews");
            
            // 2、创建Request对象
            // url: 请求路径
            // cachePolicy: 缓存协议
            // timeoutInterval: 网络请求超时时间(单位:秒)
            var urlRequest:URLRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
            
            // 3、设置请求方式为POST,默认是GET
            urlRequest.httpMethod = "POST"
            
            // 4、设置参数
            let str:String = "type=beauty"
            let data:Data = str.data(using: .utf8, allowLossyConversion: true)!
            urlRequest.httpBody = data;
            
            // 3、连接服务器
            let connection:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self)
            connection?.schedule(in: .current, forMode: .defaultRunLoopMode)
            connection?.start()
        }
    }
    
    // MARK - NSURLConnectionDataDelegate
    extension GetPostViewController:NSURLConnectionDataDelegate{
        
        func connection(_ connection: NSURLConnection, didReceive response: URLResponse) {
            
            //接收响应
        }
        
        func connection(_ connection: NSURLConnection, didReceive data: Data) {
            
            //收到数据
            self.jsonData.append(data);
        }
        
        func connectionDidFinishLoading(_ connection: NSURLConnection) {
            //请求结束
            //let jsonStr = String(data: self.jsonData as Data, encoding:String.Encoding.utf8);
            //print(jsonStr)
            do {
                let dic = try JSONSerialization.jsonObject(with: self.jsonData as Data, options: JSONSerialization.ReadingOptions.allowFragments)
                print(dic)
            } catch let error{
                print(error.localizedDescription);
            }
        }
    }
    View Code
  • 相关阅读:
    关于jar项目发布(windows)
    SpringBoot 基础(一) mybatis 通过druid配置多数据库
    redis 基础(二) Redis安装
    测试开发3年,我决定去读个名校硕士
    大厂程序员凡尔赛的一天
    假如我拥有字节工牌。。。
    上海有哪些牛逼的互联网公司?
    那些学计算机的女生后来都怎么样了?
    微信支付零花钱刷屏了!5万额度,能花又能借
    清华集训 part1
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/6662287.html
Copyright © 2020-2023  润新知