Swift学习记录 - Alamofire 4.0.1网络库基本使用(持续更新...)

23 篇文章 1 订阅

目前为止 , Alamofire网络库已经更新到4.0.1 , swift也逐渐趋于稳定 , 最近有空都是在学习swift方面的东西 . 这里主要写一些项目中 , 比较实用的网络请求 , 比较少用的 和最基础的就不写啦 …


大概请求参数介绍 :

requestHeader : 请求头
parameters : 传递参数
method : 请求类型
URL : 请求地址
encoding : 编码
responseJSON : 期待解析的数据类型 , 通常咱们用到的就是JSON数据 , 其他类型暂不介绍
response : 返回数据 可以自定义设置回调的线程, 默认主线程 , 和JSON解析相关的设置 , 这个百度即可.


//这是一个参数比较完整的GET请求 , 但是实质上 , 有几个参数我们是比较少用到的.
        let requestHeader:HTTPHeaders = ["Range":"1-3"];

        let para = ["userName":"coderMy",
        "password":"12345"];

        let mainQueue = DispatchQueue.main;

        Alamofire.request("https://www.baidu.com",
         method: .get, parameters: para, 
         encoding: URLEncoding.default, headers: requestHeader).responseJSON(queue:mainQueue, options: .allowFragments) { (response) in

         print(response)
        }

上述的request()的参数 , 为自选

也就是说平时用得比较多的 ,


GET 请求

        //method可省略 , 默认请求方式为GET 
        Alamofire.request("https://www.baidu.com",
         method: .get).responseJSON { (response) in

            Print("---------------------------\(response)")

        }


POST请求

        let para = ["userName":"coderMy",
        "password":"12345"];

        Alamofire.request("https://www.baidu.com/login",
         method: .post, parameters: para).responseJSON { (response) in

            print(response)
    }


设置请求头

添加请求头 , 有的时候我们会和服务器协商使用请求头 , 来保证我数据的可靠性或者使用请求头传递一些信息 , 比如我要请求什么数据等等 ..


        let para = ["userName":"coderMy",
        "password":"12345"];

        //请求头
        let requestHeader:HTTPHeaders = ["Range":"1-3",
        "Content-Type":"allication/json"];
        //将requestHeader 添加进request参数中

        Alamofire.request("https://www.baidu.com",
        method: .post, parameters: para, 
        headers: requestHeader).responseJSON { (response) in

              print(response)
      }


设置请求超时时间 (请求的另一种方式 , 如不设置超时时间 , 和上述GET,POST请求效果一致)

Alamofire的默认超时时间为30S ,如果我们想要更短或者更长 , 则需要自己设置 . 而这种请求方式和上述的写法有些许改变 , 和AFNetworking更相似 . 值得注意的是 , manager一定要对其强引用 , 就跟OC的一样 , 如果不设置成属性 , 则通常会报 code = -999

//设置manager属性 (重要)
var manger:SessionManager? = nil

//配置 , 通常默认即可
        let config:URLSessionConfiguration = URLSessionConfiguration.default

        //设置超时时间为15S
        config.timeoutIntervalForRequest = 15
        //根据config创建manager
        manger = SessionManager(configuration: config)
        //这里和上述大致相同
        manger?.request("https://www.baidu.com", method: .get).response { (response) in

            print("-----------------\(response)")
        }


Alamofire请求返回结果状态判断

有时候 , 比如我们访问一个服务器 , 访问成功 ,但是却没有得到我们想得到的结果 , 比如本应返回JSON数据 , 却返回了意料之外的数据 , 但是code 依然为 200 . 这时候就需要 validate 来帮我们更加细化的处理这些事了 . 这里我们还是以 Alamofire.request 这种请求方式来书写 , 使用manager 写法 , 参照上述超时写法即可 …

validate 返回状态验证 , 分两种 , 手动验证 和 自动验证 .

1 . 手动验证

此时假如我们需要的结果是: 状态码在200 -300之间 , 返回的数据为JSON类型 , 代码如下

// 第一个validate验证访问状态   第二个validate 验证返回数据类型

        Alamofire.request("https://www.baidu.com",
         method: .get)
        .validate(statusCode:200..<300)
        .validate(contentType: ["application/json"])
        .responseJSON { (response) in

            switch response.result {
                //访问成功,且数据是我们想要的类型
            case .success:

                print("--------------------是我想要的结果")
                //访问失败 , 状态码不对或者数据类型不对
            case .failure:

                print("xxxxxxxxxxxxxxxxxxx\(response.result.error.debugDescription)")
                print("--------------------不是我想要的结果")

            }
        }

这里 , 我们访问的是百度的地址 , 然后返回的类型为 test/html , 而我们需要的是JSON . 打印错误信息 , 控制台输出如下
这里写图片描述



2 . 自动验证

1 . 不设置请求头自动验证 :
如果不设置请求头进行自动验证 , 则只会自动判断返回code是否在200…299之间 , 并不会加以判断返回的数据类型 , 如下

        Alamofire.request("https://www.baidu.com",method:.get)
            .validate().response { (response) in

            print("-----------------------\(response.error?.localizedDescription)");
        }

输出错误为空 , 说明验证通过


2 . 设置请求头 , 进行自动验证

//设置请求头 ,接收类型为json数据

        let headers:HTTPHeaders = ["Accept": "application/json"]
        Alamofire.request("https://www.baidu.com",method:.get ,headers:headers)
            .validate().response { (response) in

            print("-----------------------\(response.error?.localizedDescription)");
        }

此时 , 错误有值 , 控制台打印如下 :
这里写图片描述

返回数据类型 ,与要求接收数据类型不一致 , 故自动判断错误

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值