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 条评论
登录 后参与评论

相关文章

来自专栏一个爱瞎折腾的程序猿

asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档

开局一张图,然后开始编,一些基本的asp.net core东西就不再赘述,本文只对Swashbuckle.AspNetCore的几个使用要点进行描述。

1211
来自专栏c#开发者

Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具

Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具 介绍 该工具是通过一个github上的开源项目修改的原始作者https...

4358
来自专栏落影的专栏

编译与链接过程的思考

前言 最近遇到一个错误,如下 ? 在解决过程中,回顾了很多知识,于是有了这篇文章。 关键词:预处理、编译、汇编、链接、动态链接库、静态链接库、真机调...

4809
来自专栏Greenplum

Linux 常用命令(三)

curl 命令支持在线下载功能,使用方便,它支持,S,等协议,还支持PUT,POST,COOKIES,认证授权等操作。

1110
来自专栏james大数据架构

资源等待类型sys.dm_os_wait_stats

动态管理视图  sys.dm_os_wait_stats  返回执行的线程所遇到的所有等待的相关信息。可以使用该聚合视图来诊断 SQL Server 以及特定查...

2077
来自专栏*坤的Blog

公司web安全等级提升

公司的一个web数据展示系统,本来是内网的,而且是一个单独的主机,不存在远程控制的问题,所以之前并没有考虑一些安全相关的测试.但是国调安全检查的需要添加这样子的...

1414
来自专栏熊二哥

快速入门系列--WebAPI--01基础

ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的...

4907
来自专栏王二麻子IT技术交流园地

《跟我学IDEA》四、配置模板(提高代码编写效率)

上一篇博文,我们学习了idea的一些实用配置,相信大家也对idea这个开发工具有了一个大概的了解。今天我们来学习模板的配置,idea提供很多模板从而提高编写代码...

7717
来自专栏刘望舒

Android系统启动流程(四)Launcher启动过程与系统启动流程

前言 此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:L...

2198
来自专栏FreeBuf

AutoIt木马又一发:暗藏神秘照片

AutoIt是一个自动化的Windows界面交互的脚本语言,具有很高的灵活性和较低的学习曲线。由于AutoIt解释器本身属于合法程序,黑客可以把恶意代码藏在脚本...

2739

扫码关注云+社区