-
请求超时时间设置
// 必须设置为全局的
var alamofireManager: Manager!
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.timeoutIntervalForRequest = 5 // 秒
self.alamofireManager = Manager(configuration: config)
self.alamofireManager.request(.GET, "http://120.25.226.186:32812/video?type=JSON")
-
HTTP 方法(Medthods)
Alamofire.Method enum 列表出在 RFC 2616 中定义的 HTTP 方法:
public enum Method: String {
case OPTIONS = "OPTIONS"
case GET = "GET"
case HEAD = "HEAD"
case POST = "POST"
case PUT = "PUT"
case PATCH = "PATCH"
case DELETE = "DELETE"
case TRACE = "TRACE"
case CONNECT = "CONNECT"
}
这些值可以作为 Alamofire.request 请求的第一个参数。
Alamofire.request(.POST, "https://httpbin.org/post")
Alamofire.request(.PUT, "https://httpbin.org/put")
Alamofire.request(.DELETE, "https://httpbin.org/delete")
-
请求参数编码方式设置
Alamofire 使用 Alamofire.ParameterEncoding 可以支持 URL query/URI form,JSON,PropertyList 方式编码参数。
enum ParameterEncoding {
case URL
case URLEncodedInURL
case JSON
case PropertyList(NSPropertyListFormat, NSPropertyListWriteOptions)
case Custom((URLRequestConvertible, [String : AnyObject]?) -> (NSMutableURLRequest, NSError?))
public func encode(URLRequest: URLRequestConvertible, parameters: [String : AnyObject]?) -> (NSMutableURLRequest, NSError?)
public func queryComponents(key: String, _ value: AnyObject) -> [(String, String)]
public func escape(string: String) -> String
}
// URL 形式参数编码
// 发送以下 HttpBody 内容: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
let urlStr:URLStringConvertible = "https://httpbin.org/post"
let parameters:[String: AnyObject]? = ["foo":"bar", "baz":["a", 1], "qux":["x":1, "y":2, "z":3]]
Alamofire.request(.POST, urlStr, parameters: parameters) // 默认编码方式是 URL
Alamofire.request(.POST, urlStr, parameters: parameters, encoding: .URL)
// JSON 形式参数编码
// 发送以下 HttpBody 内容: {"foo":"bar", "baz":["a", 1], "qux":{"x":1, "y":2, "z":3}}
let urlStr:URLStringConvertible = "https://httpbin.org/post"
let parameters:[String: AnyObject]? = ["foo":"bar", "baz":["a", 1], "qux":["x":1, "y":2, "z":3]]
Alamofire.request(.POST, urlStr, parameters: parameters, encoding:.JSON)
// URLRequest 请求编码
let url = NSURL(string: "https://httpbin.org/get")!
var urlRequest = NSMutableURLRequest(URL: url)
let param = ["foo": "bar"]
let encoding = Alamofire.ParameterEncoding.URL
(urlRequest, _) = encoding.encode(urlRequest, parameters: param)
-
请求头设置
let headers = ["User-Agent":"iPhone 6s Plus"]
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON", headers: headers)
// 不设置时为默认值
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
-
请求数据响应格式设置
Built-in Response Methods:
response()
responseData()
responseString(encoding:NSStringEncoding)
responseJSON(options:NSJSONReadingOptions)
responsePropertyList(options:NSPropertyListReadOptions)
可以同时响应多种格式数据。
// 响应 NSData 格式数据
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
.response { (request:NSURLRequest?, response:NSHTTPURLResponse?, responseData:NSData?, error:NSError?) in
/*
网络请求结束,成功时 error == nil。请求返回的数据存在 responseData 中,为 NSData 格式。
*/
}
// 响应 String 格式数据
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
.responseString { (response:Response<String, NSError>) in
/*
网络请求结束,成功时 response.result.error == nil。请求返回的数据存在 response.result.value 中,为 String 格式。
或者成功时 response.result 的值为 .Success,失败时 response.result 的值为 .Failure。
*/
response.request // original URL request
response.response // URL response
response.data // server data
response.result // result of response serialization
// 获取并判断结果值
if let string = response.result.value {
} else {
}
// 判断结果值
if response.result.error == nil {
} else {
}
// 判断结果值
switch response.result {
case.Success(let value):
case.Failure(let error):
}
}
// 响应 JSON 格式数据
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
.responseJSON { (response:Response<AnyObject, NSError>) in
/*
网络请求结束,成功时 response.result.error == nil。请求返回的数据存在 response.result.value 中,为 JSON 格式。
或者成功时 response.result 的值为 .Success,失败时 response.result 的值为 .Failure。
*/
}
// 响应 PList 格式数据
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
.responsePropertyList { (response:Response<AnyObject, NSError>) in
/*
网络请求结束,成功时 response.result.error == nil。请求返回的数据存在 response.result.value 中,为 PList 格式。
或者成功时 response.result 的值为 .Success,失败时 response.result 的值为 .Failure。
*/
}
// 响应 多种格式 数据
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
// 参数不使用时可以省略
.response { (_, _, responseData:NSData?, error:NSError?) in
}
.responseJSON { (response:Response<AnyObject, NSError>) in
}
-
Request 请求创建方式
// Manager 方式
// 必须设置为全局的
var alamofireManager: Manager!
self.alamofireManager = Manager(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
self.alamofireManager.request(.GET, "http://120.25.226.186:32812/video?type=JSON")
// Alamofire 方式,接收返回值
let request = Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
// 不接收返回值,request 不带参数
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video?type=JSON")
// request 带参数
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video", parameters: ["type": "JSON"])
// request 带参数及参数编码方式
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video", parameters: ["type": "JSON"], encoding: .URL)
// request 带参数及请求头
Alamofire.request(.GET, "http://192.168.88.200:8080/MJServer/video", parameters: ["type": "JSON"],
encoding: .URL,
headers: ["User-Agent":"iPhone 6s"])
-
请求任务创建方式
// 数据请求 request (GET/POST)
// Alamofire GET 方式
let urlStr:URLStringConvertible = "http://192.168.88.200:8080/MJServer/video?type=XML"
Alamofire.request(.GET, urlStr)
// Alamofire POST 方式
let urlStr:URLStringConvertible = "http://192.168.88.200:8080/MJServer/video"
Alamofire.request(.GET, urlStr, parameters: ["type": "XML"])
// Manager GET 方式
// 必须设置为全局的
var alamofireManager: Manager!
let urlStr:URLStringConvertible = "http://192.168.88.200:8080/MJServer/video?type=XML"
self.alamofireManager = Manager(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
self.alamofireManager.request(.GET, urlStr)
// Manager POST 方式
// 必须设置为全局的
var alamofireManager: Manager!
let urlStr:URLStringConvertible = "http://192.168.88.200:8080/MJServer/video"
self.alamofireManager = Manager(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
self.alamofireManager.request(.GET, urlStr, parameters: ["type": "XML"])
// 文件下载 download
// 指定文件路径方式
Alamofire.download(.GET, "http://120.25.226.186:32812/resources/videos/minion_01.mp4")
{ (temporaryURL:NSURL, response:NSHTTPURLResponse) -> NSURL in
/*
设置文件下载路径,temporaryURL 是沙盒下的文件临时存储路径,下载完成后会被自动删除。response.suggestedFilename
为服务器端文件名。此 block 在子线程中执行。
*/
return documentsDirUrl
}
.progress { (bytesWrite:Int64, totalBytesWrite:Int64, totalBytesExpectedToWrite:Int64) in
/*
监听文件下载进度,此 block 在子线程中执行。
*/
}
.response { (_, _, _, error:NSError?) in
/*
网络请求结束,成功时 error == nil。在 Swift 中文件已经存在时,再次相同路径写入会失败。
*/
}
// 使用默认提供的下载路径方式
Alamofire.download(.GET, "http://120.25.226.186:32812/resources/videos/minion_01.mp4", destination: destination)
.progress { (bytesWrite:Int64, totalBytesWrite:Int64, totalBytesExpectedToWrite:Int64) in
/*
监听文件下载进度,此 block 在子线程中执行。
*/
}
.response { (_, _, _, error:NSError?) in
/*
网络请求结束,成功时 error == nil。在 Swift 中文件已经存在时,再次相同路径写入会失败。
*/
}
// 断点续传下载方式
let downloadRequest:Request = Alamofire.download(resumeData: resumeData,
destination: { (temporaryURL:NSURL,
response:NSHTTPURLResponse) -> NSURL in
/*
设置文件下载路径,temporaryURL 是沙盒下的文件临时存储路径,下载完成后会被自动删除。response.suggestedFilename
为服务器端文件名。此 block 在子线程中执行。
*/
return documentsDirUrl
})
.progress { (bytesWrite:Int64, totalBytesWrite:Int64, totalBytesExpectedToWrite:Int64) in
/*
监听文件下载进度,此 block 在子线程中执行。
*/
}
.response { (_, _, data:NSData?, error:NSError?) in
/*
网络请求结束,成功时 error == nil。在 Swift 中文件已经存在时,再次相同路径写入会失败。
*/
}
// 文件上传 upload
// Data 形式上传
Alamofire.upload(.POST, "http://192.168.88.200:8080/MJServer/upload", headers: headers, data: formBody)
.progress { (bytesLoad:Int64, totalBytesLoad:Int64, totalBytesExpectedToLoad:Int64) in
/*
监听文件上传进度,此 block 在子线程中执行。
*/
}
.response { (_, _, responseData:NSData?, error:NSError?) in
/*
网络请求结束。
*/
}
// MultipartFormData 形式上传
Alamofire.upload(.POST, "http://192.168.88.200:8080/MJServer/upload",
multipartFormData: { (formData:MultipartFormData) in
/*
添加参数。第一个参数是需要添加的参数内容值,第二个是后台规定的参数名。
设置上传的文件。第一个参数是需要上传的文件路径,第二个是后台规定的参数名,第三个是上传后服务器端文件名称,第四个是文件类型。
*/
}) { (encodingResult:Manager.MultipartFormDataEncodingResult) in
/*
数据编码完成。
*/
switch encodingResult {
// 编码成功
case .Success(let uploadRequest, _, _):
uploadRequest
.progress { (bytesLoad:Int64, totalBytesLoad:Int64, totalBytesExpectedToLoad:Int64) in
/*
监听文件上传进度,此 block 在子线程中执行。
*/
}
.response { (_, _, responseData:NSData?, error:NSError?) in
/*
网络请求结束。
*/
}
// 编码失败
case .Failure(let error):
print(error)
}
}
-
请求任务设置
// 继续请求任务
downloadRequest.resume()
// 暂停请求任务
downloadRequest.suspend()
// 取消请求任务
downloadRequest.cancel()
-
文件下载设置
// 设置文件下载路径
let documentsDirUrl:NSURL = NSFileManager.defaultManager()
.URLsForDirectory( .DocumentDirectory, inDomains: .UserDomainMask)[0]
.URLByAppendingPathComponent(response.suggestedFilename!)
if NSFileManager.defaultManager().fileExistsAtPath(documentsDirUrl.path!) {
// 移除已经存在的文件,在 Swift 中文件已经存在时,再次相同路径写入会失败
try! NSFileManager.defaultManager().removeItemAtURL(documentsDirUrl)
}
// 设置文件默认下载路径
let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)
// 监听文件下载进度
bytesWrite // 本次写入的大小
totalBytesWrite // 已经写入的大小
totalBytesExpectedToWrite // 总大小
// 设置下载进度条
let progressNum:NSNumber = NSNumber(float: Float(Double(totalBytesWrite)/Double(totalBytesExpectedToWrite)))
self.performSelectorOnMainThread(#selector(ViewController.refreshProgress(_:)), withObject: progressNum, waitUntilDone: true)
-
文件上传设置
// Data 形式上传
let boundary = "myBoundary"
// 设置请求头
/*
upload task 不会在请求头里添加 content-type (上传数据类型)字段,@"myBoundary" 为请求体边界,参数可以随便设置,但需一致
*/
let headers = ["Content-Type":"multipart/form-data; charset=utf-8; boundary=\(boundary)"]
// 设置请求文件参数
let formBody = NSMutableData()
// 参数开始分割线
/*
每个参数开始前都需要加
*/
formBody.appendData("--\(boundary)".dataUsingEncoding(NSUTF8StringEncoding)!)
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// 参数
formBody.appendData("Content-Disposition: form-data; name=\"\("username")\"\r\n\r\n\("jhq")"
.dataUsingEncoding(NSUTF8StringEncoding)!)
// username 是后台规定的参数名,jhq 是需要添加的参数内容值
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// 文件开始分割线
/*
每个文件开始前都需要加
*/
formBody.appendData("--\(boundary)".dataUsingEncoding(NSUTF8StringEncoding)!)
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// 文件参数名
formBody.appendData("Content-Disposition: form-data; name=\"\("file")\"; filename=\"\("test.mp4")\""
.dataUsingEncoding(NSUTF8StringEncoding)!)
// file 是后台规定的参数名,test.mp4 为上传后服务器端文件名称
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// 文件的类型
formBody.appendData("Content-Type: mp4".dataUsingEncoding(NSUTF8StringEncoding)!)
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// 待上传文件数据
/*
本地待上传的文件路径
*/
formBody.appendData(NSData(contentsOfFile: NSBundle.mainBundle().pathForResource("minion", ofType: "mp4")!)!)
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// 结束分割线标记
formBody.appendData("--\(boundary)--".dataUsingEncoding(NSUTF8StringEncoding)!)
formBody.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// 指定文件路径形式上传
/*
public func appendBodyPart(fileURL fileURL: NSURL, name: String, fileName: String, mimeType: String);
第一个参数是需要上传的文件路径,第二个是后台规定的参数名,第三个是上传后服务器端文件名称,第四个是文件类型。
*/
let fileUrl = NSBundle.mainBundle().URLForResource("HQ_0005", withExtension: "jpg")!
formData.appendBodyPart(fileURL: fileUrl, name: "file", fileName: "test.png", mimeType: "image/jpeg")
// 指定文件数据形式上传
/*
public func appendBodyPart(data data: NSData, name: String, fileName: String, mimeType: String);
第一个参数是需要上传的文件数据,第二个是后台规定的参数名,第三个是上传后服务器端文件名称,第四个是文件类型。
*/
let fileData = NSData(contentsOfFile: NSBundle.mainBundle().pathForResource("minion", ofType: "mp4")!)
formData.appendBodyPart(data: fileData!, name: "file", fileName: "test.mp4", mimeType: "mp4")
// 添加参数
/*
public func appendBodyPart(data data: NSData, name: String);
第一个参数是需要添加的参数内容值,第二个是后台规定的参数名。
*/
formData.appendBodyPart(data: "jhq".dataUsingEncoding(NSUTF8StringEncoding)!, name: "username")
// 监听文件上传进度
bytesLoad // 本次写入的大小
totalBytesLoad // 已经写入的大小
totalBytesExpectedToLoad // 总大小
let progressNum1:NSNumber = NSNumber(float: Float(Double(totalBytesLoad)/Double(totalBytesExpectedToLoad)))
self.performSelectorOnMainThread(#selector(ViewController.refreshProgress(_:)), withObject: progressNum1, waitUntilDone: true)