1. Alamofire 的請求方式
1.1 GET 請求 (默認就是get請求)
Alamofire.request(urlString).responseJSON { (response) in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
1.2 其他方式請求
// 參數method 就是設置請求類型的, 以post為例
Alamofire.request(urlString, method: .post, parameters: parameters as? Parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
switch response.result {
case .success(let json):
print("json: \(json)")
case .failure(let error):
debugPrint(error.localizedDescription)
}
}
- request 的第一個參數
url
支持多種類型(String、URL、Request
),在框架內部已經為我們處理好了,怎么方便怎么用- Alamofire.request 后得到
DataRequest
類型對象, 直接調用responseJSON
獲取json數據
1.3 Alamofire 的request
public func request(
_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil)
-> DataRequest
- 默認不設置請求方法為get方法,因此使用中get方法,不需要配置直接通過url發起請求
- 參數Parameters為字典類型,默認為空
2. Alamofire 設置公共參數
- 創建MyAdapter類繼承協議,并實現協議方法
import UIKit
import Alamofire
// MARK: 遵守RequestAdapter 協議
class MyAdapter: RequestAdapter {
// 實現adapt 協議方法, 來完成公共參數的配置
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var request = urlRequest
// 需要什么就設置什么
request.setValue("device", forHTTPHeaderField: "iOS")
request.setValue("vision", forHTTPHeaderField: "1.0.0")
return request
}
}
- 設置開發中使用到的公共參數
// 配置公共信息: 這里的default是個單列,屬性設置一次就好,不用在每次請求前設置
Alamofire.SessionManager.default.adapter = MyAdapter()
Alamofire.request(urlString, method: .post, parameters: parameters as? Parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
switch response.result {
case .success(let json):
print("json: \(json)")
case .failure(let error):
debugPrint(error.localizedDescription)
}
}
3. Alamofire 請求重定向
- 創建MyAdapter類繼承協議,并實現協議方法, 設置屬性就和設置公共參數一樣
import UIKit
import Alamofire
// MARK: 遵守RequestAdapter 協議
class MyAdapter: RequestAdapter {
// 重新設置了請求URLRequest對象,改變了請求url
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
let newRequest = URLRequest.init(url: URL(string: "https://www.baidu.com")!)
return newRequest
}
}
4. Alamofire 的自定義驗證
調用validate方法,實現參數閉包,在閉包內攔截錯誤消息,對錯誤響應統一處理.
Alamofire.request(urlString, method: .post, parameters: parameters as? Parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
switch response.result {
case .success(let json):
print("json: \(json)")
success(json)
case .failure(let error):
debugPrint(error.localizedDescription)
failure(error)
}
}.validate { (request, response, data) -> Request.ValidationResult in
print("validate中的response: \(response)")
guard let _ = data else {
return .failure(NSError(domain: "沒有數據", code: 9999, userInfo: nil))
}
if response.statusCode == 404 {
return .failure(NSError(domain: "系統繁忙", code: response.statusCode, userInfo: nil))
}
return .success
}
5. Alamofire 上傳文件(以文字+圖片為例)
func upload(status: String,images:[UIImage], success:@escaping (Any?)->(), failure:@escaping (Any?)->()){
// 請求url
let urlString = "上傳文件的地址"
let statusString = "一些文字內容"
Alamofire.upload(multipartFormData: { (formData) in
// 普通參數 - 拼接到表單
formData.append(access_token.data(using: .utf8)!, withName: "access_token")
formData.append(statusString.data(using: .utf8)!, withName: "status")
/*
- 參數01 上傳的二進制文件
- 參數02 服務器指定的名字 pic mp4 mp3 區分客戶端上傳的是什么文件描述
- 參數03 文件路徑名字 一般可以隨意些 及時你寫了 服務器也不用
- 參數04 告知服務器我們上傳的文件的類型 一般可以傳入application/octet-stream
*/
// 如果一次發布9張圖片怎么辦 -> 通過循環方式上傳
let data = images.first?.pngData()
if let d = data {
formData.append(d, withName: "pic", fileName: "xxxxf", mimeType: "application/octet-stream")
}
}, to: urlString) { (result) in
switch result {
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
print("上傳進度\(progress)")
}).responseJSON(completionHandler: { (response) in
switch response.result {
case .success(let json):
success(json)
break
case .failure(let error):
failure(error)
break
}
})
break
case .failure(let error):
failure(error)
break
}
print("result:\(result)")
}
}
待更新...