Alamofire库在iOS开发中的基础及进阶用法大全

GET 请求

import Alamofire


Alamofire.request("https://example.com/get", method: .get)

.responseJSON { response in

switch response.result {

case .success(let JSON):

print("Success with JSON: \(JSON)")

case .failure(let error):

print("Request failed with error: \(error)")

}

}


POST 请求

Alamofire.request("https://example.com/post", method: .post, parameters: ["foo": "bar"], encoding: JSONEncoding.default)

.responseJSON { response in

// 处理响应

}


URL编码

let parameters: Parameters = ["q": "Alamofire"]


Alamofire.request("https://example.com/search", parameters: parameters)

// 处理响应...


JSON编码

let parameters: Parameters = ["foo": "bar"]


Alamofire.request("https://example.com/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)

// 处理响应...


HTTP头部自定义

let headers: HTTPHeaders = [

"Authorization": "Bearer access_token",

"Accept": "application/json"

]


Alamofire.request("https://example.com/get", headers: headers)

// 处理响应...


上传文件

let fileURL = Bundle.main.url(forResource: "video", withExtension: "mp4")!


Alamofire.upload(fileURL, to: "https://example.com/upload")

.responseJSON { response in

// 处理响应...

}


下载文件

let destination: DownloadRequest.DownloadFileDestination = { _, _ in

let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]

let fileURL = documentsURL.appendingPathComponent("file.pdf")


return (fileURL, [.removePreviousFile, .createIntermediateDirectories])

}


Alamofire.download("https://example.com/file.pdf", to: destination)

.response { response in

// 检查 response.destinationURL 确认下载位置

// 处理响应...

}


使用Response Handler处理响应

Alamofire.request("https://example.com/get")

.responseJSON { response in

// 使用 JSON 数据...

}

.responseString { response in

// 使用 String 数据...

}


多部分表单上传

Alamofire.upload(

multipartFormData: { multipartFormData in

multipartFormData.append("Hello".data(using: String.Encoding.utf8)!, withName: "greeting")

multipartFormData.append(Data("name".utf8), withName: "who")

},

to: "https://example.com/multipartForm",

encodingCompletion: { encodingResult in

switch encodingResult {

case .success(let upload, _, _):

upload.responseJSON { response in

// 处理上传响应...

}

case .failure(let encodingError):

print(encodingError)

}

}

)


错误处理

Alamofire.request("https://example.com/notfound", method: .get)

.validate()

.responseJSON { response in

switch response.result {

case .success:

// 解析JSON...

case .failure(let error):

// 错误处理...

print(error)

}

}


请求处理

let request = Alamofire.request("https://example.com/data")

.responseJSON { response in

// 处理响应...

}


request.cancel() // 取消请求


监听网络状态

let networkReachabilityManager = NetworkReachabilityManager()


networkReachabilityManager?.startListening { status in

switch status {

case .notReachable:

print("The network is not reachable")

case .unknown :

print("It is unknown whether the network is reachable")

case .reachable(.ethernetOrWiFi):

print("The network is reachable over the WiFi or Ethernet connection")

case .reachable(.wwan):

print("The network is reachable over the WWAN (cellular) connection")

}

}


链式请求与响应处理

Alamofire.request("https://example.com/data")

.validate(statusCode: 200..<300)

.validate(contentType: ["application/json"])

.responseData { response in

switch response.result {

case .success(let data):

// 处理 data

case .failure(let error):

// 处理 error

}

}


自定义请求适配器和重试器

class CustomRequestAdapter: RequestAdapter {

func adapt(_ urlRequest: URLRequest) throws -> URLRequest {

var urlRequest = urlRequest

// 修改请求头部或者查询参数等

urlRequest.setValue("mySecretToken", forHTTPHeaderField: "Authorization")

return urlRequest

}

}


let sessionManager = SessionManager()

sessionManager.adapter = CustomRequestAdapter()


sessionManager.request("https://httpbin.org/get").responseJSON { response in

// 处理响应...

}


在请求失败时自动进行重试

class CustomRetrier: RequestRetrier {

func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {

// 检查错误代码, 决定是否需要重试

if ... {

completion(true, 1.0) // 重试,延迟1秒

} else {

completion(false, 0.0) // 不重试

}

}

}


let sessionManager = SessionManager()

sessionManager.retrier = CustomRetrier()


sessionManager.request("https://httpbin.org/get").responseJSON { response in

// 处理响应...

}


响应序列化

以下是使用JSON 序列化器作为一个例子:

Alamofire.request("https://httpbin.org/get").responseJSON { response in

if let json = response.result.value {

print("JSON: \(json)")

}

}


SSL Pinning

let serverTrustPolicies: [String: ServerTrustPolicy] = [

"example.com": .pinPublicKeys(

publicKeys: ServerTrustPolicy.publicKeys(),

validateCertificateChain: true,

validateHost: true

)

]


let sessionManager = SessionManager(

serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)

)


sessionManager.request("https://example.com/secure").response { response in

// 处理使用SSL Pinning的响应...

}


图片下载和缓存

import AlamofireImage


let imageView = UIImageView()

let url = URL(string: "https://example.com/image.png")!


imageView.af_setImage(withURL: url)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容