iOS学习笔记——AlamoFire

前言

在移动开发中,发起http请求几乎是每个app必备的功能。今天就用这篇博客记录iOS发起http请求的示例代码。

本文基于swift,使用第三方库Alamofire

引入第三方库

iOS与Android类似,都会通过一个构建脚本来实现对工程第三方依赖的管理。在Android中这个脚本叫build.gradle。在iOS开发中,这个脚本叫Podfile。我们通过编辑Podfile管理iOS工程的依赖:

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进行一些简单的请求了:

        // 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的各部分打印出来:

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
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请求

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请求

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

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方法。

let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)
Alamofire.download("https://httpbin.org/image/png", to: destination)

以上就是AlamoFire的基本使用,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android小菜鸡

混合开发之解决H5页面出现广告的问题

  公司采用了H5和Android混合开发,以原生代码为壳,H5代码编写逻辑的方式做产品。笔者之前写过一篇文章简单聊到了这种方式,有兴趣的朋友可以了解一下,顺便...

631
来自专栏码洞

HTTP协议冷知识大全

HTTP协议是纯文本协议,没有任何加密措施。通过HTTP协议传输的数据都可以在网络上被完全监听。如果用户登陆时将用户名和密码直接明文通过HTTP协议传输过去了,...

652
来自专栏快乐八哥

Angular企业级开发(9)-前后端分离之后添加验证码

1.背景介绍 团队开发的项目,前端基于Bootstrap+AngularJS,后端Spring MVC以RESTful接口给前端调用。开发和部署都是前后端分离。...

27510
来自专栏小筱月

跨域 webpack + vue-cil 中 proxyTable 处理跨域

973
来自专栏韩东吉的Unity杂货铺

零基础入门 22: UGUI Panel

今天要给大家分享的。。。可谓是,非常的简单啊,我甚至都在考虑要不要单独抽出一次当做分享内容 (・-・*),也有可能是我所有分享里文字数目最少的

772
来自专栏Script Boy (CN-SIMO)

Ajax数据的爬取(淘女郎为例)

如果使用的是 Chrome 的话,可以首先选中 XHR 来更快速的找出获取数据的 API,如果在 XHR 里面没有再去 JS 里面一个个的寻找。

34010
来自专栏Web 开发

分层解耦,理想很美好,现实很残酷

自从实习以来,不是第一次有这种想法了。 今天弄一个简单的发邮件功能,使用PHP自带的mail()函数实现,基本就照着php.net上面的例子来写,结果… 情...

500
来自专栏python学习指南

python爬虫(四)_urllib2库的基本使用

本篇我们将开始学习如何进行网页抓取,更多内容请参考:python学习指南 urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络...

19110
来自专栏漏斗社区

一个能让你技能加身的HDWiki漏洞

1424
来自专栏阿炬.NET

如何在已有项目中引入FineUIMvc

1242

扫码关注云+社区