iOS学习笔记——AlamoFire

2018-07-03 13:20:37 浏览数 (1)

前言

在移动开发中,发起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

AlamoFirerequest方法的第二个参数,即是选择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的基本使用,欢迎指正。

0 人点赞