Swift - HTTP网络操作库SwiftHTTP使用详解1(配置,及数据请求)
一,SwiftHTTP的说明与配置
1,什么是SwiftHTTP
SwiftHTTP本质是基于`NSURLSession`,并做了封装。使用SwiftHTTP可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用。(有点类似于我前面文章介绍的另一个网络库:Alamofire)
2,SwiftHTTP的功能特性:
(4)内置JSON请求序列化
(5)上传/下载文件带有进度
(6)代码简洁
3,SwiftHTTP的安装与配置
(3)工程 -> General -> Embedded Binaries项,增加 SwiftHTTP.framework

(4)最后,在需要使用 SwiftHTTP 的地方 import 进来就可以了
二,使用SwiftHTTP进行数据请求
1,GET请求
(1)不带参数
(2)带参数
2,POST请求
服务端代码(test.php)如下:
3,响应处理
(1)获取返回的字符串数据
(4)使用 response.description 可以输出所有响应信息,便于调试
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
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¶m2=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)
三,使用操作队列进行请求
SwiftHTTP同样支持运行队列(Operation Queue),我们可以把所有数据请求放到队列中就回自动进行多线程异步请求。
同时通过 maxConcurrentOperationCount 属性,可以设置同一时间最多允许多少个请求同时进行。
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() //取消这个请求任务也可以通过 NSOperationQueue 的 cancelAllOperations() 方法取消所有的任务:
operationQueue.cancelAllOperations() //取消所有线程操作
非常感谢航哥,但最近又遇到问题,我用get获取网页数据时结果时nil,如http://www.qq.com,就不行,结果却又是200。
但http://www.baidu.com又可以。 我用其他语言没出现过这种情况
import SwiftHTTP这一句显示no such modules 'SwiftHTTP',但是我明明已经将下载下来的源码包中 SwiftHTTP.xcodeproj 拖拽至工程中,在Embedded Binaries项增加 SwiftHTTP.framework了
航哥,在你这学了不少东西。发现个事,向swift项目中导入oc框架,大部分时候把一对名字相同的.m和.h文件复制添加到工程下,然后用header文件桥接一下就好了。可是导入swift的框架我感觉反而麻烦了,通常要要把整个。xcodeproj文件拖到自己的项目中,有时候不小心还会造成没有复制到自己的文件夹下。有没有好的方法能辨别出框架中的核心代码然后选中添加到自己的项目中?有时候把第三方的demo的拖进来了 觉得好别扭。不然的话只能再学cocopods了
这个swifthttp好像只能兼容ios8以后的,要是要做成ios7.0之后的怎么弄?有没有办法?
目前只要改为ios7.0都没法通过编译了,请站长解答
站长,如果我要给云端发送指令,该怎么发送呢
给个思路吧,是不是在get url后面加上自己的参数?但是指令都是大括号的,我看您写的都是中括号,大括号写行不行?
站长,我在进行具体的响应操作中去改变ui,结果需要在我改变ui的函数上加上self. ,而却并不能成功改变ui,如果不经过网络请求直接调用我ui函数则可以,请站长帮帮忙,谢谢
为什么我使用post请求的时候不管url是什么都可以进行请求,就是说它都不会请求失败,打印data时一直打印null,求解答,非常急,万分感谢。
站长,问个问题,我下下来的没问题,导入项目中也是没问题的能使用,就是拖进项目的时候没有提示将文件拷贝到项目中,这样就有个问题了,我把项目的位置改变了就没有东西了,里面的库什么的 都没有了无法使用,这个应该怎么解决呢??
我和2楼和3楼遇到的问题一样,无法import Swifthttp,项目中没有中文
HTTP.GET(url:String, parameters:HTTPParameterProtocol?, headers: [String : String]?, requestSerializer: HTTPSerializeProtocol)
航大大 不好意思啊 这问题 困扰我很久 是四个参数啊 第四个参数不理解 我就是从你的连接下的 难道更新了?
说错了!!!是第四个参数.第三个是头我弄明白了.第四个怎么填呢?感谢
航哥 get带参数的方法,跟你的 不一样啊 一共有三个参数。第三个参数 是什么啊
航哥:第二个方法:起那面两个参数 还知道是什么,第三个参数是什么呢?
HTTP.GET(String)
HTTP.GET(url:String, parameters:HTTPParameterProtocol?, headers: [String : String]?, requestSerializer: HTTPSerializeProtocol)
航哥,我这个该怎么处理异步的问题呢,ui先于数据之前出来了,数据就展示不了了
航哥,请教。文中“我们使用字典作为参数,用工具可以看到发送的数据如下: ”,这里的工具是什么?
通过get方式得到如下字符串:如何提取出 最下面的json
获取到数据: URL:
XXX./Login/loginProcess/robot/response.description123/username/114/password/menjiQQ
Status Code:
200
Headers:
Pragma: no-cache
Connection: keep-alive
X-Powered-By: PHP/5.5.9
Content-Length: 41
Server: nginx/1.0.15
Content-Type: text/html
Date: Fri, 29 Jan 2016 03:44:15 GMT
Set-Cookie: PHPSESSID=vs1bmcbnutge93ddrsrcia4mr1; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Payload:
{"result":"1","shopid":"22","bossid":"1"}
编译了就可以了 谢谢了 不用了 麻烦了
import SwiftHTTP这句话提示cannot load underlying module for swiftHTTP 怎么办
没有中文啊或者带有swift
代码如下
import UIKit
import SwiftHTTP
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
import SwiftHTTP这句话提示cannot load underlying module for swiftHTTP 怎么办
另外 真心非常感谢站长提高这么好的资料
航哥,您好,看到您写的这篇关于SwiftHTTP的文章非常高兴。现在遇到一个问题。我GET需要传的parameters: 是Json类型的String,比如{"Phone":"15021208008","Type":0}。或者PUT是Json类型的Struct,比如{"Phone":"15021208008","Loc":{"Position":{"Lat":39.91295,"Lng":116.403},"Addr":"北京市东城区广场西侧路"},"ACode":"9331","Psw":"4C0FC85FA1F01624C8A4C4D938234D2D"}。不知道应该怎么写这个parameters: 请您指教,十分感谢!如能详细请教您更为感激,我的联系方式是我下面留的QQ邮箱,谢谢航哥!