Swift - 原生GET&POST请求的用法

简介: Swift - 原生GET&POST请求的用法

只要属于移动开发的范畴,网络请求一定是其中的重头戏,Object-C的网络请求大家都不陌生,不过感觉很熟悉的貌似也不多,因为第三方的库用起来更加方便,比如我们所熟知的AFNetworking,在Swift中,也存在一些封装的比较好的网络请求库,不过我今天说的不是那种第三方的,而是原生的请求方法,下面看代码:

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let getBtn = UIButton(type: .System)
        getBtn.frame = CGRectMake(50, 100, 100, 100)
        getBtn.setTitle("GET", forState: .Normal)
        getBtn.setTitleColor(UIColor.blackColor(), forState: .Normal)
        getBtn.addTarget(self, action: #selector(self.GETACtion), forControlEvents: .TouchUpInside)
        self.view.addSubview(getBtn)
        let postBtn = UIButton(type: .System)
        postBtn.frame = CGRectMake(self.view.frame.size.width - 150, 100, 100, 100)
        postBtn.setTitle("POST", forState: .Normal)
        postBtn.setTitleColor(UIColor.blackColor(), forState: .Normal)
        postBtn.addTarget(self, action: #selector(self.POSTACtion), forControlEvents: .TouchUpInside)
        self.view.addSubview(postBtn)
    }
    /**
     往下看你会发现其实GET和POST差不多是一样的,一般我们认为GET方法是不用上传参数的,所有的参数都在请求链接中或者索性直接没参数,在这里GET方法中你看到参数是可以放在请求体中的,而大多数搜索到的区别都认为GET的参数在请求链接上,这种说法是不对的,GET参数完全可以放在请求体中,并不是因为GET连接长度有限制,起到限制的不是http协议,而是服务器和浏览器,所以乍一看这里GET和POST几乎一样,但它们在HTTPMethod是有着本质区别的,不再说本质区别,有兴趣的自己了解。
     另外需要注意的是,这里的字典,如果你想封装的话一定要考虑字典为空的情况,如果为空,请不要使用    
     request.HTTPMethod = "XXX",否则会报错,所以,如你所见,当字典为空时,POST和GET没有任何区别,但至于它属于什么方法,我并没有从网上找到答案,留待大家补充
     */
    /**
     GET请求
     */
    func GETACtion() {
        //请求URL
        let url:NSURL! = NSURL(string: "http://iappfree.candou.com:8080/free/applications/limited")
        let request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
        let list  = NSMutableArray()
        var paramDic = [String: String]()
        if paramDic.count > 0 {
            //设置为GET请求
            request.HTTPMethod = "GET"
            //拆分字典,subDic是其中一项,将key与value变成字符串
            for subDic in paramDic {
                let tmpStr = "\(subDic.0)=\(subDic.1)"
                list.addObject(tmpStr)
            }
            //用&拼接变成字符串的字典各项
            let paramStr = list.componentsJoinedByString("&")
            //UTF8转码,防止汉字符号引起的非法网址
            let paraData = paramStr.dataUsingEncoding(NSUTF8StringEncoding)
            //设置请求体
            request.HTTPBody = paraData
        }
        //默认session配置
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)
        //发起请求
        let dataTask = session.dataTaskWithRequest(request) { (data, response, error) in
            //            let str:String! = String(data: data!, encoding: NSUTF8StringEncoding)
            //            print("str:\(str)")
            //转Json
            let jsonData:NSDictionary = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
            print(jsonData)
        }
        //请求开始
        dataTask.resume()
    }
    /**
     POST请求
     */
    func POSTACtion() {
        //请求URL
        let url:NSURL! = NSURL(string: "http://iappfree.candou.com:8080/free/applications/limited")
        let request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
        let list  = NSMutableArray()
        var paramDic = [String: String]()
        if paramDic.count > 0 {
            //设置为POST请求
            request.HTTPMethod = "POST"
            //拆分字典,subDic是其中一项,将key与value变成字符串
            for subDic in paramDic {
                let tmpStr = "\(subDic.0)=\(subDic.1)"
                list.addObject(tmpStr)
            }
            //用&拼接变成字符串的字典各项
            let paramStr = list.componentsJoinedByString("&")
            //UTF8转码,防止汉字符号引起的非法网址
            let paraData = paramStr.dataUsingEncoding(NSUTF8StringEncoding)
            //设置请求体
            request.HTTPBody = paraData
        }
        //默认session配置
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)
        //发起请求
        let dataTask = session.dataTaskWithRequest(request) { (data, response, error) in
            //            let str:String! = String(data: data!, encoding: NSUTF8StringEncoding)
            //            print("str:\(str)")
            //转Json
            let jsonData:NSDictionary = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
            print(jsonData)
        }
        //请求开始
        dataTask.resume()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
目录
相关文章
|
2月前
|
JavaScript 前端开发 Swift
swift-UISegmentedControl和UIWebView的用法
这是关于 `UISegmentedControl`和 `UIWebView`的基本用法。它们是iOS应用中常用的界面元素,可以帮助您实现用户友好的交互和显示Web内容。详细的用法可以参考苹果官方文档以及在线教程和示例代码。
54 3
|
2月前
|
Swift iOS开发
Swift-UITableView的用法
这是一个简要的UITableView用法概述。UITableView是一个非常灵活和强大的界面组件,可以用于展示各种类型的数据,从简单的列表到复杂的数据集。详细的用法可以参考苹果官方文档以及在线教程和示例代码。
50 3
|
Swift
Swift - Alamofire简单GET和POST使用
Swift - Alamofire简单GET和POST使用
340 0
|
iOS开发 API Swift
ios swift 打造自己的http请求工具
在ios开发中,网络请求是不可以少的,说到网络请求可能用的最多的就是第三方的比人比较有名的AFNetworking、Alamofire等,原生的用的少。今天就用ios提供的原生方法来打造属于自己的一个网络请求工具吧。
1284 0
|
测试技术 iOS开发
[重构 Swift 中单例的用法](Refactoring singleton usage in Swift)
本文讲的是[重构 Swift 中单例的用法](Refactoring singleton usage in Swift),在软件开发中,单例模式有足够的原因被广泛的不推荐和不赞成。它们难以测试或者说是不可能测试,当它们在其他类中隐式调用时会使你的代码库混乱,让代码难以复用。
1485 0
|
前端开发 测试技术 Android开发
[译] 原生 iOS(Swift) 和 React-Native 的性能比较
本文讲的是[译] 原生 iOS(Swift) 和 React-Native 的性能比较,React-Native 是一个混合的移动框架,可以让你仅仅使用 JavaScript 来构建应用。然而,与其他混合移动开发技术不同的是,你构建的并不是一个 “移动网页应用”(把网页应用封装到一个原生的容器里)。
3065 0
|
JSON Go 数据格式
Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire
升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swift 自己的原生类型 URLSession,而不是NSURLSession。
924 0
|
iOS开发
【iOS开发】Swift Print 高级用法
这个东西不是我写的,出自 StackOverFlow,但我觉得实在是写得太好了,于是截取了该部分分享出来,感谢原作者。 StackOverFlow
858 0
|
Swift
swift字符串相关用法速查表
http://www.cocoachina.com/swift/20151218/14746.html
685 0