返回 导航

Swift

hangge.com

Swift - HTTP网络操作库SwiftHTTP使用详解1(配置,及数据请求)

作者:hangge | 2016-01-28 09:06
一,SwiftHTTP的说明与配置

1,什么是SwiftHTTP
SwiftHTTP本质是基于`NSURLSession`,并做了封装。使用SwiftHTTP可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。(有点类似于我前面文章介绍的另一个网络库:Alamofire

2,SwiftHTTP的功能特性:
(1)便利的闭包API
(2)支持运行队列(NSOperationQueue)
(3)支持参数编码
(4)内置JSON请求序列化
(5)上传/下载文件带有进度
(6)代码简洁

3,SwiftHTTP的安装与配置 
(1)从 GitHub 上下载最新的代码:https://github.com/daltoniam/SwiftHTTP 
(2)将下载下来的源码包中 SwiftHTTP.xcodeproj 拖拽至你的工程中

(3)工程 -> General -> Embedded Binaries项,增加 SwiftHTTP.framework

(4)最后,在需要使用 SwiftHTTP 的地方 import 进来就可以了
import SwiftHTTP

二,使用SwiftHTTP进行数据请求
1,GET请求
(1)不带参数
do {
    let opt = try HTTP.GET("http://hangge.com")
    opt.start { response in
        //进行具体的响应操作...
    }
} catch let error {
    print("请求失败: \(error)")
}

(2)带参数
do {
    //实际的url是: http://www.hangge.com/test.php?hello=world&param2=1&ids[]=1&ids[]=2
    let opt = try HTTP.GET("http://www.hangge.com/test.php",
        parameters: ["hello": "world", "param2": 1, "ids": [1,2]])
    opt.start { response in
        //进行具体的响应操作...
    }
} catch let error {
    print("请求失败: \(error)")
}

2,POST请求
let params = ["param": "param1",
    "array": ["first array element","second","third"],
    "num": 23,
    "dict": ["someKey": "someVal"]]

do {
    let opt = try HTTP.POST("http://www.hangge.com/test.php", parameters: params)
    opt.start { response in
        //进行具体的响应操作...
    }
} catch let error {
    print("请求失败: \(error)")
}
我们使用字典作为参数,用工具可以看到发送的数据如下: 

服务端代码(test.php)如下:
<?
$param = $_POST["param"];
$num = $_POST["num"];
$dict = $_POST["dict"];
$array = $_POST["array"];

echo $param."\n";
echo $num."\n";
echo $dict["someKey"]."\n";
echo $array[0]."\n";
?>

3,响应处理
(1)获取返回的字符串数据
do {
    let opt = try HTTP.GET("http://hangge.com")
    opt.start { response in
        if let err = response.error {
            print("error: \(err.localizedDescription)")
            return
        }
        print("获取到数据: \(response.text)")
    }
} catch let error {
    print("请求失败: \(error)")
}
(2)也可先获取 NSData 数据,再转成字符串
do {
    let opt = try HTTP.GET("http://hangge.com")
    opt.start { response in
        if let err = response.error {
            print("error: \(err.localizedDescription)")
            return
        }
        let data=response.data as NSData
        let str=NSString(data: data, encoding: NSUTF8StringEncoding)
        print("获取到数据: \(str)")
    }
} catch let error {
    print("请求失败: \(error)")
}
(3)获取响应头和响应状态码
do {
    let opt = try HTTP.GET("http://hangge.com")
    opt.start { response in
        print("statusCode: \(response.statusCode)\n")
        print("headers: \(response.headers)")
    }
} catch let error {
    print("请求失败: \(error)")
}

(4)使用 response.description 可以输出所有响应信息,便于调试
do {
    let opt = try HTTP.GET("http://hangge.com")
    opt.start { response in
        print(response.description)
    }
} catch let error {
    print("请求失败: \(error)")
}

4,支持自定义Http头信息(HTTP Headers)
do {
    let opt = try HTTP.GET("http://www.hangge.com", parameters: ["hello": "there"],
        headers: ["header": "value"])
    opt.start { response in
        //进行具体的响应操作...
    }
} catch let error {
    print("请求失败: \(error)")
}

三,使用操作队列进行请求
SwiftHTTP同样支持运行队列(Operation Queue),我们可以把所有数据请求放到队列中就回自动进行多线程异步请求。
同时通过 maxConcurrentOperationCount 属性,可以设置同一时间最多允许多少个请求同时进行。
let operationQueue = NSOperationQueue()
operationQueue.maxConcurrentOperationCount = 2 //最大任务数

do {
    let opt1 = try HTTP.New("http://www.hangge.com", method: .GET)
    opt1.onFinish = { response in
        //进行具体的响应操作...
    }
    operationQueue.addOperation(opt1)
    
    let opt2 = try HTTP.New("http://www.baidu.com", method: .GET)
    opt2.onFinish = { response in
        //进行具体的响应操作...
    }
    operationQueue.addOperation(opt2)
    
    let opt3 = try HTTP.New("http://www.iteye.com", method: .GET)
    opt3.onFinish = { response in
        //进行具体的响应操作...
    }
    operationQueue.addOperation(opt3)
} catch let error {
    print("请求失败: \(error)")
}
可以使用 cancel() 方法停止单个任务:
opt2.cancel() //取消这个请求任务
也可以通过 NSOperationQueuecancelAllOperations() 方法取消所有的任务:
operationQueue.cancelAllOperations() //取消所有线程操作
评论

全部评论(20)

回到顶部