Alamofire是一个swift语言的网络开源库,主要用于网络请求,响应操作,响应校验,响应缓存
其基本用法如下:
进行网络请求、响应操作、响应校验、响应缓存
http方式、parameter编码、http headers 、验证
数据的上传与下载
工具类有CURL command outPut、statical metrics
高级用法
url 绘话管理、绘话代理、绘话请求
routing请求操作
model objects
安全已经网络监测
例子一、一个简单的网络请求
Alamofire
.request("https://httpbin.org/getdata").responseJSON{ response in
// 这是一个简单的网络请求,采用的是get请求
/*response常用的几个属性
*
request
原url请求
*
response
httpurl的响应
*
result
序列化的操作
*/
print(
"Request: \(String(describing: response.request))"
) // 打印请求的URL
print(
"Response: \(String(describing: response.response))"
) //打印请求的响应
print(
"Result: \(response.result)"
) //打印返回的序列化内容
if let json = response.result.value {
//序列化后的内容 主要输出的是json内容格式
}
if let data = response.data let utf8 = String(data:data, encoding:.utf8) {
// 以二进制数据进行输出,主要用于进行缓存
}
}
Alamofire
一共包含了5中不同的响应方式
第一种 返回response对象
func response(
queue
: DispatchQueue
?
, completionHandler: @escaping (DefaultDataResponse)
->
Void
)
-> Self
第二种 返回data数据
func responseData(
queue
: DispatchQueue
?
, completionHandler: @escaping (DataResponse
)
->
Void
)
-> Self
第三种 返回string
func responseString(
queue
: DispatchQueue
?
, encoding:
String.
Encoding
?
, completionHandler: @escaping (DataResponse
)
->
Void
)
-> Self
第四种返回json
func responseJSON(
queue
: DispatchQueue
?
, completionHandler: @escaping (DataResponse
<
Any
>
)
->
Void
)
-> Self
第五种 返回list
func responsePropertyList(
queue
: DispatchQueue
?
, completionHandler: @escaping (DataResponse
<
Any
>
)
->
Void
))
-> Self
一、
response
仅仅用于响应请求操作,仅仅是进行执行请求
Alamofire.
request
(
"https://httpbin.org/get"
).
response
{
response
in
print(
"Request: \(response.request)"
) print(
"Response: \(response.response)"
) print(
"Error: \(response.error)"
)
if
let
data =
response
.data,
let
utf8Text =
String
(data: data, encoding: .utf8) { print(
"Data: \(utf8Text)"
) }}
二、
responseData
用于进行响应数据操作
Alamofire.
request
(
"https://httpbin.org/get"
).responseData {
response
in
debugPrint(
"All Response Info: \(response)"
)// value是data数据
if
let
data =
response
.result.value,
let
utf8Text =
String
(data: data, encoding: .utf8) { print(
"Data: \(utf8Text)"
) }}
三
responseString
用于字符串响应处理
Alamofire.request(
"https://httpbin.org/get"
).responseString { response
in
vale是string数据 print("Success: \(response.result.isSuccess)") print("Response String: \(response.result.value)")}
responseJSON
用于返回json数据
Alamofire.
request
(
"https://httpbin.org/get"
).responseJSON {
response
in
debugPrint(
response
)// value是任意类型数据
if
let
json =
response
.result.value { print(
"JSON: \(json)"
) }}
请求链接响应时的操作
Alamofire
.request
(
"https://httpbin.org/get"
)
.responseString
{ response
in
print(
"Response String: \(response.result.value)"
) }
.responseJSON
{ response
in
print(
"Response JSON: \(response.result.value)"
) }
响应线程
// 创建一个队列,队列中有线程
let utilityQueue = DispatchQueue
.global
(qos:
.utility
)Alamofire
.request
(
"https://httpbin.org/get"
)
.responseJSON
(queue: utilityQueue) { response
in
// 在线程种去执行此操作 print("Executing response handler on utility queue")}
手动的去响应校验
Alamofire.
request
(
"https://httpbin.org/get"
) .validate(statusCode:
200.
.<
300
) 200- 300之间的字节,将要校验的字节 .validate(contentType: [
"application/json"
]) 内容格式为json .responseData {
response
in
switch
response
.result {
case
.success: print(
"Validation Successful"
)
case
.failure(
let
error
): print(
error
) } }
自动响应校验
Alamofire.
request
(
"https://httpbin.org/get"
).validate().responseJSON {
response
in
switch
response
.result {
case
.success: print(
"Validation Successful"
)
case
.failure(
let
error
): print(
error
) }}
http的请求方法
public
enum
HTTPMethod: String {
case
options =
"OPTIONS"
case
get
=
"GET" // get
case
head =
"HEAD"
case
post =
"POST" //post
case
put =
"PUT"
case
patch =
"PATCH"
case
delete =
"DELETE"
case
trace =
"TRACE"
case
connect =
"CONNECT" // 长链接
}
例如:
Alamofire.request("https://httpbin.org/post", method: .post) //进行的post请求操作
Alamofire
.request
(
"https://httpbin.org/put"
, method:
.put
)// put 请求操作
参数编码格式
url的编码格式
let parameters: Parameters = [
"foo"
:
"bar"
] 编码格式为foo与bar// All three of these calls are equivalentAlamofire
.request
(
"https://httpbin.org/get"
, parameters: parameters) // encoding defaults to `URLEncoding
.default
`Alamofire
.request
(
"https://httpbin.org/get"
, parameters: parameters, encoding: URLEncoding
.default
)Alamofire
.request
(
"https://httpbin.org/get"
, parameters: parameters, encoding: URLEncoding(destination:
.methodDependent
))
// post请求的编码格式
let parameters: Parameters = [
"foo"
:
"bar"
,
"baz"
: [
"a"
,
1
],
"qux"
: [
"x"
:
1
,
"y"
:
2
,
"z"
:
3
]]// All three of these calls are equivalentAlamofire
.request
(
"https://httpbin.org/post"
, method:
.post
, parameters: parameters)Alamofire
.request
(
"https://httpbin.org/post"
, method:
.post
, parameters: parameters, encoding: URLEncoding
.default
)Alamofire
.request
(
"https://httpbin.org/post"
, method:
.post
, parameters: parameters, encoding: URLEncoding
.httpBody
)
json的编码格式
let parameters: Parameters = [
"foo"
: [
1
,
2
,
3
],
"bar"
: [
"baz"
:
"qux"
]]// Both calls are equivalentAlamofire
.request
(
"https://httpbin.org/post"
, method:
.post
, parameters: parameters, encoding: JSONEncoding
.default
)Alamofire
.request
(
"https://httpbin.org/post"
, method:
.post
, parameters: parameters, encoding: JSONEncoding(options: []))
自定义的编码格式
// 自定义的编码
struct
JSONStringArrayEncoding: ParameterEncoding {
private
let
array
: [String] init(
array
: [String]) { self.
array
=
array
} func encode(_ urlRequest: URLRequestConvertible,
with
parameters: Parameters?) throws -> URLRequest { var urlRequest =
try
urlRequest.asURLRequest()
let
data =
try
JSONSerialization.data(withJSONObject:
array
, options: [])
if
urlRequest.
value
(forHTTPHeaderField:
"Content-Type"
) == nil { urlRequest.setValue(
"application/json"
, forHTTPHeaderField:
"Content-Type"
) } urlRequest.httpBody = data return urlRequest }}
http的headers
let
headers: HTTPHeaders = [
"Authorization"
:
"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
, //授权
"Accept"
:
"application/json" // 接受
]Alamofire.
request
(
"https://httpbin.org/headers"
, headers: headers).responseJSON {
response
in
debugPrint(
response
)}
例如:含账户和密码的授权请求
let
user =
"user"
let
password =
"password"
Alamofire.
request
(
"https://httpbin.org/basic-auth/\(user)/\(password)"
) .authenticate(user: user, password: password) .responseJSON {
response
in
debugPrint(
response
) }
let
user =
"user"
let
password =
"password"
var headers: HTTPHeaders = [:] /空字典
if
let
authorizationHeader =
Request
.authorizationHeader(user: user, password: password) { headers[authorizationHeader.key] = authorizationHeader.value}
Alamofire.
request
(
"https://httpbin.org/basic-auth/user/password"
, headers: headers) .responseJSON {
response
in
debugPrint(
response
) }
url请求证书的授权
let
user =
"user"
let
password =
"password"
let
credential = URLCredential(user: user, password: password, persistence: .forSession)
Alamofire.
request
(
"https://httpbin.org/basic-auth/\(user)/\(password)"
) .authenticate(usingCredential: credential) .responseJSON {
response
in
debugPrint(
response
) }
下载一个data到文件
Alamofire
.download(
"https://httpbin.org/image/png"
).responseData { response
in
if
let
data
= response.result.value {
let
image
=
UIImage
(
data
:
data
) }}
下载进度显示
Alamofire
.download(
"https://httpbin.org/image/png"
) .downloadProgress { progress
in
print(
"Download Progress: \(progress.fractionCompleted)"
)
// 下载的完成进度 } .responseData { response in if let data = response.result.value { let image = UIImage(data: data) } }
与线程关联的下载进度
let
utilityQueue
=
DispatchQueue
.global
(qos:
.
utility)Alamofire
.
download(
"https://httpbin.org/image/png"
)
.
downloadProgress(
queue
: utilityQueue) { progress
in
print(
"Download Progress: \(progress.fractionCompleted)"
) }
.
responseData { response
in
if
let
data
=
response
.
result
.
value {
let
image
=
UIImage(
data
:
data
) } }
更新data到服务器
let
imageData = UIPNGRepresentation(image)!
Alamofire.upload(imageData,
to
:
"https://httpbin.org/post"
).responseJSON {
response
in
debugPrint(
response
)}
跟新文件
let fileURL = Bundle
.main.url
(forResource:
"video"
, withExtension:
"mov"
)
Alamofire
.upload
(fileURL, to:
"https://httpbin.org/post"
)
.responseJSON
{ response
in
debugPrint(response)}
更新可变数据
Alamofire.upload( multipartFormData: { multipartFormData
in
multipartFormData.append(unicornImageURL, withName:
"unicorn"
) multipartFormData.append(rainbowImageURL, withName:
"rainbow"
) },
to
:
"https://httpbin.org/post"
, encodingCompletion: { encodingResult
in
switch encodingResult {
case
.success(
let
upload, _, _): upload.responseJSON {
response
in
debugPrint(
response
) }
case
.failure(
let
encodingError): print(encodingError) } })
更新进度
let fileURL = Bundle.main.url(
forResource
:
"video"
,
withExtension
:
"mov"
)
Alamofire.upload(fileURL,
to
:
"https://httpbin.org/post"
)
// 更新进度 .uploadProgress { progress in // main queue by default print("Upload Progress: \(progress.fractionCompleted)") }
// 下载进度 .downloadProgress { progress in // main queue by default print("Download Progress: \(progress.fractionCompleted)") }
// 是否完成 .responseJSON { response in debugPrint(response) }
高级应用
请求协议管理
Alamofire
.request
(
"https://httpbin.org/get"
)
相等于
let sessionManager = Alamofire
.SessionManager.default
sessionManager
.request
(
"https://httpbin.org/get"
)
默认配置创建sessionManager
let
configuration
= URLSessionConfiguration.
default
let sessionManager =
Alamofire.SessionManager(
configuration
:
configuration
)
后台任务
let
configuration
= URLSessionConfiguration.background(withIdentifier:
"com.example.app.background"
)
let sessionManager = Alamofire.SessionManager(
configuration
:
configuration
)
暂时任务
let
configuration
= URLSessionConfiguration.ephemeral
let sessionManager = Alamofire.SessionManager(
configuration
:
configuration
)
配置session
var
defaultHeaders =
Alamofire
.
SessionManager
.defaultHTTPHeadersdefaultHeaders["
DNT
"] = "1 (
Do
Not
Track
Enabled
)"// http dnt设置
let
configuration =
URLSessionConfiguration
.
default
configuration
.httpAdditionalHeaders = defaultHeaders
let
sessionManager =
Alamofire
.
SessionManager
(configuration: configuration)
sessionManager的代理
let
sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.
default
)
let
delegate
: Alamofire.SessionDelegate = sessionManager.
delegate
delegate
.taskWillPerformHTTPRedirection = { session, task, response, request
in
var
finalRequest = request
if
let
originalRequest = task.originalRequest,
let
urlString = originalRequest.url?.urlString, urlString.contains(
"apple.com"
) { finalRequest = originalRequest }
return
finalRequest}