iOS 开发继续加油swiftiOS网络架构

网络请求及利用Swift第三方库Alamofire做网络请求

2016-09-23  本文已影响4804人  T92

在做网络请求前要先修改info.plist文件,给他增加键值对,增加方式有两种,可视化操作和代码操作:

选择代码显示

然后再代码中添加下面语句

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

操作完成后想要检测是否成功可以用可视化的显示看一下是否多出了相应的键值对
  网络请求系统自带有NSURLConnection和NSURLSession两种类,其中NSURLConnection在iOS9.0之后就被废除了,但是还是能用,系统提供的网络请求也不是太好用,所以一般也采用第三方库进行网络请求。
  在iOS开发中一般网络请求是HTTP协议的请求,HTTP请求有多种方式,我们一般也就使用GET和POST方式。

GET
GET请求:通过请求URI得到资源(查询)
GET请求一般涉及到的内容不是重要信息,因为没有安全性,在url中能直接看到相关的参数和参数值
POST请求:用于添加新的内容(传数据)

利用NSURLConnection做(GET)网络请求

import UIKit

//NSURLConnection:通过http协议做网络请求,使用的时候内部已经将一些必须的固定的内容封装好了,我们在使用的时候只需要确定请求头中的请求方式(GET/POST)、请求地址和请求体

//使用步骤:
//1.确定请求路径(NSURL)
//2.创建请求对象(NSURLRequest)
//3.发送请求(NSURLConnection)

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.test1()
    }
}

//MARK: - 通过闭包获取请求结果
extension ViewController{
    func test1(){
        
        //1.创建请求路径
        let url = NSURL(string: "http://ikapp.ikang.com/appService/market/mainEvent")
        
        //2.根据请求路径创建请求对象(GET)
        let request = NSURLRequest(URL: url!)
        
        //3.发送请求
        //异步
        //参数1:需要发送给服务器的请求对象
        //参数2:队列,参数3中的任务添加的对象(耗时操作创建新队列,UI操作用主队列)
        //参数3:服务器返回数据之后需要执行的任务对应的闭包
        //闭包参数1:服务器响应信息
        //闭包参数2:服务器返回给客户端的数据
        //闭包参数3:错误信息
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, data, error) in
//            print(response)
//            print(data)
//            print(error)
//            print(NSThread.currentThread())
            
            //解析数据(前提:必须知道数据的格式,a.确定数据是json数据还是xml数据,b.确定json数据最外层的格式)
            
            //json解析(最外层字典)
            //参数1:需要解析的json的二进制
            //参数2:.MutableContainers(json最外层是数组或者字典选这个选项)
            let dict = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)
            print(dict)
            
            //获取数据数组
            let array = dict["results"]
            print(array)
        }
    }
}

利用NSURLSession做(GET)网络请求

import UIKit

//使用NSURLSession做网络请求
//1.NSURL(请求路径)
//2.NSURLRequest(请求对象)

//3.NSURLSessionConfiguration(会话模式)
//DefaultSessionConfiguration(默认会话)一般iOS开发就用这一个
//ephemeralSessionConfiguration(瞬时会话模式)
//backgroundSessionConfiguration(后台会话模式)

//4.NSURLSessionTask(任务)
//NSURLSessionDataTask -> 一般做数据请求任务(从服务器获取一般的数据网络请求)
//NSURLSessionDownloadTask -> 下载任务(下载文件)
//NSURLSessionUploadTask -> 上传任务(上传文件)

//5.NSURLSession:同来封装http协议中固定的数据

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //1.创建请求路径
        let path = "http://0.0.0.0:tuicool@api.tuicool.com/api/articles/hot.json"
        //拼接参数(GET请求参数需要以"?"连接拼接到请求地址的后面,多个参数用"&"隔开,参数形式:参数名=参数值)
        //size:请求数据的长度
        let path2 = path + "?cid=0&size=30"
        //转换成url(统一资源定位符)
        let url = NSURL(string: path2)
        
        //2.创建请求对象
        //NSURLRequest类型的请求对象的请求方式一定是GET(默认GET且不能被改变)
        let request = NSURLRequest(URL: url!)
        
        //3.根据会话模式创建session(创建默认会话模式)
        //方式1:一般不采用
        //let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
        //方式2:快速创建默认会话模式的session
        let session = NSURLSession.sharedSession()
        
        //4.创建任务
        //参数1:需要发送的请求对象
        //参数2:服务返回数据的时候需要执行的对应的闭包
        //闭包参数1:服务器返回给客户端的数据
        //闭包参数2:服务器响应信息
        //闭包参数3:错误信息
        let task = session.dataTaskWithRequest(request) { (data, response, error) in
            
            //注意:当前这个闭包是在子线程中执行的,如果想要在这儿执行UI操作必须通过线程间的通信回到主线程
            
//            print(response)
//            print("能接受到")
//            print(NSThread.currentThread())
            
            //解析json
            //参数options:.MutableContainers(json最外层是数组或者字典选这个选项)
            if data != nil{
                let dict = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)
                print(dict)
            }
            else{
                print("请求数据失败")
            }
        }
        
        //5.开始执行任务
        task.resume()    
    }
}

利用NSURLSession做(POST)网络请求

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //1.创建请求地址
        let url = NSURL(string: "http://0.0.0.0:tuicool@api.tuicool.com/api/signup/register_by_email.json")
        
        //2.创建求情对象
        //POST请求的请求对象必须使用NSMutableURLRequest创建,因为使用NSURLRequest不能更改请求方式,但是NSMutableURLRequest可以
        let request = NSMutableURLRequest(URL: url!)
        //设置请求方式(默认GET)
        request.HTTPMethod = "POST" //设置请求方式为POST请求
        //设置请求体(POST请求的参数是放到请求体中的)
        //a.拼接字符串
        //参数1=参数值1&参数2=参数2...
        let sendStr = "email=10165910@163.com&name=鱼摆摆&password=123456789"
        //b.将字符串转换成二进制
        //参数:编码方式
        let sendData = sendStr.dataUsingEncoding(NSUTF8StringEncoding)
        request.HTTPBody = sendData
        
        //3.创建session
        //快速创建一个默认会话模式的session
        let session = NSURLSession.sharedSession()
        
        //4.创建任务
        let task = session.dataTaskWithRequest(request) { (data, response, error) in
            print(response)
            
            if data != nil{
                let ret = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)
                print(ret)
            }
            else{
                print("请求失败")
            }
        }
        
        //5.开始执行任务
        task.resume()
    }
}

利用Swift第三方库Alamofire做网络请求

如何使用第三方库:http://www.jianshu.com/p/734f7b1280f3

import UIKit
import Alamofire

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //self.test1()
        //self.test2()
        self.test0()
        
    }
}

//MARK: - 方式1 带参
extension ViewController{
    
    //GET
    func test1(){
        //参数1:请求方式
        //参数2:请求路径
        //参数3:参数列表
        //参数4:编码方式(参数拼接方式)
        //参数5:需要设置的请求头的的信息
        Alamofire.request(.GET, "http://0.0.0.0:tuicool@api.tuicool.com/api/articles/hot.json", parameters: ["cid":0,"size":30], encoding: .URL, headers: nil).responseJSON { (data) in
            
            //接收到服务器返回的数据之后会调用这个闭包
            
            print(data)
        }
    }
    
    //POST
    func test0(){
        Alamofire.request(.POST, "http://0.0.0.0:tuicool@api.tuicool.com/api/signup/register_by_email.json", parameters: ["email":"101659109@qq.com","name":"鱼摆摆","password":"123456789"], encoding: .URL, headers: nil).responseJSON(options: .MutableContainers) { (data) in
            print(data)
        }
    }
}

//MARK: - 方式2 不带参
extension ViewController{
    func test2(){
        //参数1:请求方式
        //参数2:请求地址
        Alamofire.request(.GET, "http://0.0.0.0:tuicool@api.tuicool.com/api/articles/hot.json").responseJSON(options: .MutableContainers) { (data) in
            print(data)
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读