前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS学习笔记——AlamoFire

iOS学习笔记——AlamoFire

作者头像
Oceanlong
发布2018-07-03 13:20:37
1.8K0
发布2018-07-03 13:20:37
举报
文章被收录于专栏:移动开发面面观

前言

在移动开发中,发起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的基本使用,欢迎指正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.02.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 引入第三方库
  • 普通json请求
    • 快速使用
      • response
        • get or post
          • params
            • get请求
            • post请求
          • headers
          • 下载文件
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档