前言
在移动开发中,发起http请求几乎是每个app必备的功能。今天就用这篇博客记录iOS发起http请求的示例代码。
本文基于swift,使用第三方库Alamofire。
引入第三方库
iOS与Android类似,都会通过一个构建脚本来实现对工程第三方依赖的管理。在Android中这个脚本叫build.gradle。在iOS开发中,这个脚本叫Podfile。我们通过编辑Podfile管理iOS工程的依赖:
代码语言:javascript复制platform :ios, '8.0'
use_frameworks!
target 'Hello_ios' do
pod 'SDWebImage', '~> 3.7.1'
pod 'RoutingHTTPServer', '~> 1.0.0'
pod 'Masonry', '~> 0.6.1'
pod 'ASIHTTPRequest', '~> 1.8.2'
pod 'MBProgressHUD', '~> 0.9.1'
pod 'Alamofire', '~> 4.6'
end
~
我们通过上面的配置代码可以看到,Podfile中配置了iOS的平台最低版本、工程名以及各种第三方依赖的版本号。
Podfile编写完成后,我们只需要在当前目录下执行pod install
即可。
普通json请求
快速使用
在学习一个知识点时,我们通常需要先学会一个最简单的、能快速看到结果的例子。然后基于这个例子,再去举一反三的学习。完成上面的配置后,我们可以使用AlamoFire进行一些简单的请求了:
代码语言:javascript复制 // Alamofire 4
Alamofire.request("https://httpbin.org/get").responseJSON { response in
if let json = response.result.value {
print("JSON: (json)")
let dico = json as? [String: AnyObject]
if let origin = dico?["url"]{
if origin is String{
lable.text = origin as? String
}else{
lable.text = "不存在此项或类型错误"
}
}
}
}
在上面的例子中,我们使用了AlamoFire最简单的调用形式,进行了一次get请求,然后直接将返回的json中的某一项显示了出来。
接下来,我们将对AlamoFire的细节进行一些探究。
response
在上面的请求中,我们直接使用了,response.result.value。那么http请求的其他信息,我们在哪里获取呢?我们打response的各部分打印出来:
代码语言:javascript复制print("Request: (String(describing: response.request))") // original url request
print("Response: (String(describing: response.response))") // http url response
print("Result: (String(describing: response.result.value))") // response serialization result
代码语言:javascript复制Request: Optional(https://httpbin.org/get)
Response: Optional(<NSHTTPURLResponse: 0x604000239a00> { URL: https://httpbin.org/get } { Status Code: 200, Headers {
"Access-Control-Allow-Credentials" = (
true
);
"Access-Control-Allow-Origin" = (
"*"
);
Connection = (
"keep-alive"
);
"Content-Length" = (
362
);
"Content-Type" = (
"application/json"
);
Date = (
"Thu, 01 Feb 2018 10:49:50 GMT"
);
Server = (
"meinheld/0.6.1"
);
Via = (
"1.1 vegur"
);
"X-Powered-By" = (
Flask
);
"X-Processed-Time" = (
"0.000910997390747"
);
} })
Result: Optional({
args = {
};
headers = {
Accept = "*/*";
"Accept-Encoding" = "gzip;q=1.0, compress;q=0.5";
"Accept-Language" = "en;q=1.0";
Connection = close;
Host = "httpbin.org";
"User-Agent" = "Hello_ios/1.0 (lsy.Hello-ios; build:1; iOS 11.2.0) Alamofire/4.6.0";
};
origin = "113.116.156.221";
url = "https://httpbin.org/get";
})
由上面的log,我们可以比较清晰地看到,在response中,到底包含了哪些信息。http请求的报文中的所有信息,应该都被封装进了response中。
get or post
AlamoFire的request
方法的第二个参数,即是选择http请求的方式,如果不输入,默认为get请求:
Alamofire.request("https://httpbin.org/get") Alamofire.request("https://httpbin.org/post", method: .post) Alamofire.request("https://httpbin.org/put", method: .put) Alamofire.request("https://httpbin.org/delete", method: .delete)
params
AlamoFire我们提供了比较完备的封装。
get请求
代码语言:javascript复制let parameters: Parameters = ["foo": "bar"]
// All three of these calls are equivalent
Alamofire.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))
// https://httpbin.org/get?foo=bar
post请求
代码语言:javascript复制let parameters: Parameters = [
"foo": "bar",
"baz": ["a", 1],
"qux": [
"x": 1,
"y": 2,
"z": 3
]
]
// All three of these calls are equivalent
Alamofire.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)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
headers
代码语言:javascript复制let headers: HTTPHeaders = [
"Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
"Accept": "application/json"
]
Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in
debugPrint(response)
}
下载文件
下载文件与普通的http请求不同。普通的http请求由于响应报文内容较少,我们直接将响应报文存在内存中。而当我们用http去请求一个文件时,响应的报文可能非常,远超我们的内存能承受的范围。因此,我们需要将其直接写入文件中。
大致的思路就是,我们先创建好一个文件,获取它的destination。然后调用Alamofire的download方法。
代码语言:javascript复制let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)
Alamofire.download("https://httpbin.org/image/png", to: destination)
以上就是AlamoFire的基本使用,欢迎指正。