zoukankan      html  css  js  c++  java
  • Swift # GET&POST请求 网络缓存的简单处理

     GET & POST 的对比

    源码:https://github.com/SpongeBob-GitHub/Get-Post.git

     

     1. URL

        - GET

            所有的参数都包含在 URL 中

            1. 如果需要添加参数,脚本后面使用 `?`

            2. 参数格式:值对

                参数名=值

            3. 如果有多个参数,使用 `&` 连接

            4. 在 get 方法中,url字符串中不能包含中文或者特殊符号 空格

               如果出现,需要添加百分号转义

        - POST

            URL中不包含参数,直接指定登录脚本即可

     2. Request

        - GET

            - 因为 GET 的效率高,而且性能好,能够被缓存,使用频率高

            - 是默认的请求方法,不需要任何设定

        - POST

            - 需要指定请求方法

                request.HTTPMethod = @"POST";

            - 所有参数都包含在请求体中,二进制数据,来源:firebug的源代码中粘贴

            - 参数格式,和 GET 的几乎一致,只是没有 `?`

            - POST方法获得的网络数据不能被缓存

     3. Connection

        这是一个最单纯的网络方法,只是发送"请求",接收服务器返回的二进制"实体数据"

        GET & POST 没有任何区别

    GET:

        /// GET 登录
        func getLogin() {
            let username = "SpongeBob"
            let pwd = "1234567890"
            
            /**
            GET 方法中,所有的参数都包含在 URL 中
            
            提示:login.php 是测试用的脚本
            
            【需要:在Mac电脑上,配置Apache服务器--http://www.cnblogs.com/SpongeBob-GitHub/p/4496164.html & 将login.php脚本放到服务器上!】
            注意:得先启动配置好的Apache服务器
                $ sudo apachectl -k restart
            
            1. 如果需要添加参数,使用 ?
            2. 参数格式:值对
            参数名=值
            3. 如果有多个参数,使用 & 连接
            
            4. 在 get 方法中,url字符串中不能包含中文或者特殊符号 空格
            如果出现,需要添加[百分号]转义
            */
            var urlString = NSString(format: "http://127.0.0.1/login.php?username=(username)&password=(pwd)")
            // 利用UTF8编码
            urlString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
            let url = NSURL(string: urlString as String)
            
            // 因为 GET 的效率高,而且性能好,因此在网络访问中,使用频率非常高!默认的请求方法就是 GET 的,无需指定!
            // GET 方法是可以缓存的!
            var request = NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReturnCacheDataElseLoad, timeoutInterval: 10.0)
            
            println(request.HTTPMethod)
            
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, connectionError) -> Void in
                
                println(response)
                
                if connectionError != nil {
                    
                    println("login error....(connectionError)")
    
                } else {
                    
                    // 这里的data数据,就是通过GET请求获取到的,第一次获取成功后,就缓存到本地沙盒中,下次就不再获取,直接从本地加载!!!--缓存
                    
                    // 问题:但是如果这时候,服务器中返回的数据修改了,这里依然会打印修改前的data!
                    // 比如:将login.php脚本中得返回userName改成 xxxx,依然会打印为SpongeBob。
                    
                    // FIXME: 这种问题一般会出现在图片的获取,我们重新写一个类来解决这个问题!
                    
                    var dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
                    
                    println("GET: -> (dict)")
                }
                
            }
        }
    

    POST:

        /// POST 登录
        func postLogin() {
            let username = "SpongeBob"
            let pwd = "1234567890"
    
            let url = NSURL(string: "http://localhost/login.php")
            var request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReturnCacheDataElseLoad, timeoutInterval: 10.0)
            request.HTTPMethod = "POST"
            
            println(request.HTTPMethod)
    
            // 设置请求体为二进制数据
            var bodyStr = NSString(format: "username=(username)&password=(pwd)")
            request.HTTPBody = bodyStr.dataUsingEncoding(NSUTF8StringEncoding)
            
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, connectionError) -> Void in
                
                println(response)
                
                if connectionError != nil {
                    
                    println("login error....(connectionError)")
                    
                } else {
                    
                    var dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
                    
                    println("POST: -> (dict)")
                }
            }
        }
    

    针对于GET请求缓存----》 

    这里的data数据,就是通过GET请求获取到的,第一次获取成功后,就缓存到本地沙盒中,下次就不再获取,直接从本地加载!!!--缓存

    问题:但是如果这时候,服务器中返回的数据修改了,这里依然会打印修改前的data!

    比如:将login.php脚本中得返回userName改成 xxxx,依然会打印为SpongeBob。

      FIXME: 这种问题一般会出现在图片的获取,我们重新写一个类来解决这个问题!

        /// GET 加载网络图片 -- 缓存
        func loadImageWithGET() {
            let url = NSURL(string: "http://localhost/images/1.png")
            var request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10.0)
            
            // 设置请求头 - 利用“If-None-Match”判断是否改变
            request.setValue(self.etag, forHTTPHeaderField: "If-None-Match")
            
            println(request.HTTPMethod)
            
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, connectionError) -> Void in
                
                var httpRespone = response as! NSHTTPURLResponse
                println("(httpRespone.allHeaderFields) + (httpRespone)")
                
                // 第2次点击时,为304,即需要从本地加载
                
                if httpRespone.statusCode == 304 {
                    println("Loading the local data...")
                    
                    // NSURLCache
                    var cacheResponse = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
                    self.imgView.image = UIImage(data: cacheResponse!.data)
                    return
                }
                
                self.etag = httpRespone.allHeaderFields["Etag"] as? String
                
                
                self.imgView.image = UIImage(data: data)
            }
        }
    

    网络缓存的处理

    /**

     * [iOS] 简述 NSURLCache 的存储目录

     **

        (lldb) po NSHomeDirectory()

        "/Users/xxxx/Library/Developer/CoreSimulator/Devices/5A46B8A4-xxxx-4B6A-B5B8-F76A6E13998F/data/Containers/Data/Application/EFEF0D66-xxxx-4EE6-B569-F94429362922"

     **

        使用AFNetworking 、 SDWebImage 等等开源库做网络数据缓存的时候要注意可能会出现重复缓存(因为NSURLCache已经做了一次缓存,存在Disk中 !

        1. 使用 NSURLConnect,、UIWebView 。。 的都会使用导 NSURLCache 的缓存

        2. 当使用 NSURL 相关的框架,使用到缓存的时候,系统会在 Caches目录下创建一个 跟 bundle identifer 同名的一个文件夹,以及里面的 Cache.db、Cache.db-shm、Cache.db-wal

        三个文件和文件夹 fsCacheData/

        ·fsCacheData/ 文件夹会在有需要缓存数据到文件的数据才会有,如缓存图片

        3. 可以使用 [[NSURLCache sharedURLCache]removeAllCachedResponses] 清理这里所有的缓存数据。

    */

    在AppDelegate.swift中添加

        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            
            /**
             * 设置网络缓存
             **
            
             内存缓存 4M
             磁盘缓存 20M
             diskPath-》nil,会缓存到 cached 的 bundleId 目录下
            
             SDWebImage 的缓存
            
             1. 缓存时间--1周
             2. 处理缓存文件,监听系统退出到后台的事件
                - 遍历缓存文件夹,删除所有过期的文件
                - 继续遍历缓存文件夹,将最大的文件删除,一直删除到缓存文件的大小和指定的“磁盘限额”一致
            
             */
            
            let cache = NSURLCache(memoryCapacity: 4 * 1024 * 1024, diskCapacity: 20 * 1024 * 1024, diskPath: nil)
            NSURLCache .setSharedURLCache(cache)
            
            return true
        }
  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/Trybst/p/4704660.html
Copyright © 2011-2022 走看看