MGJRequestManager 是一款基于 AFNetwokring 2.0+ 的 iOS 网络库。
一般在做项目时,我们都会在 AFNetworking 的基础上再封装一层,加入一些业务逻辑,然后作为统一的 API 层。细分下来的话,功能点其实不多,且相对固定和通用,就索性把这些常用的功能统一处理,并提供灵活的使用方式,于是就有了 MGJRequestManager。
MGJRequestManager 目前被用在「蘑菇街」,「小店」等 App 中,已稳定运行了一段时间。
以「蘑菇街」为例,统计这块会计算请求消耗的时间、每次请求都要发送的参数、据请求参数的值计算 token、缓存请求以便快速呈现等等,MGJRequestManager 都可以比较方便地搞定。
缓存GET请求(可以方便地开启/关闭)
设置 Builtin 参数(每次请求都会带上的参数,如设备型号等)
符合某种(自定义)条件时,可以不发送请求(比如用户多次点击「喜欢」按钮)
对请求结果做预处理(比如将服务端返回的数据包装成统一的格式)
串行发送多个请求(比如 token 过期后,可以将请求新 token 和当前请求串起来)
并行发送多个请求,可以告知请求完成数,以及全部请求完成后调用某个 callback
发送请求时显示 loading,发送完成后隐藏 loading
上传图片
取消正在发送的请求
因为需求经常会变,所以架构需要非常灵活才能方便应对新功能,比如「发送请求时显示 loading,发送完成后隐藏 loading」这个只是利用了现成的接口实现的一个特性。一些常见的需求都可以通过对 MGJRequestManager 进行配置来实现。
本着「everything should be as simple as possible, but not simpler」的原则,设计这个类库时,希望使用起来和理解起来尽量方便,同时又足够灵活,可以应付大多数的场景。
主要分为两部分 MGJRequestManagerConfiguration
和 MGJRequestManager
,前者做一些自定义配置,比如请求发送前/后的预处理,baseURL,userInfo等。后者记录下这些信息,在适当的时候消费它们,同时支持针对某些特殊请求做自定义配置。
pod 'MGJRequestManager'
以「发送请求时显示 loading,发送完成后隐藏 loading」为例
// 1 MGJRequestManagerConfiguration *configuration = [[MGJRequestManagerConfiguration alloc] init]; UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; indicatorView.frame = CGRectMake(self.view.frame.size.width / 2 - 8, self.view.frame.size.height / 2 - 8, 16, 16); [self.view addSubview:indicatorView]; // 2 configuration.requestHandler = ^(AFHTTPRequestOperation *operation, id userInfo, BOOL *shouldStopProcessing) { if (userInfo[@"showLoading"]) { [indicatorView startAnimating]; } }; // 3 configuration.responseHandler = ^(AFHTTPRequestOperation *operation, id userInfo, MGJResponse *response, BOOL *shouldStopProcessing) { if (userInfo[@"showLoading"]) { [indicatorView stopAnimating]; } }; [MGJRequestManager sharedInstance].configuration = configuration; // 4 [[MGJRequestManager sharedInstance] GET:@"http://httpbin.org/delay/2" parameters:nil startImmediately:YES // 5 configurationHandler:^(MGJRequestManagerConfiguration *configuration){ configuration.userInfo = @{@"showLoading": @YES}; // 6 } completionHandler:^(NSError *error, id<NSObject> result, BOOL isFromCache, AFHTTPRequestOperation *operation) { [self appendLog:result.description]; // 7 }];
MGJRequestManager
要配合 MGJRequestManagerConfiguration
才能发挥出威力。这个 configuration 可以配置 baseURL
, requestHandler
, responseHandler
等信息,可变部分一般是通过对 MGJRequestManagerConfiguration
进行配置来实现的。可以全局设置一个 configuration,然后单独发送请求时还可以覆盖默认设置。
requestHandler
这个 block 会在请求发送前被触发,userInfo
这个参数时 configuration
这个实例的一个属性,方便起见,作为参数传给了 requestHandler
。还有一个重要的参数时 *shouldStopProcessing
,如果在这个 block 里,它被设置为了 YES
,那么这个请求将不会被发送。
responseHandler
这个 block 会在收到服务端的响应后被触发,response
参数有 error
和 result
两个属性,服务端返回的数据都被放到了 result
属性里,在这里可以对它进行解析,然后重新设置 response。如果 *shouldStopProcessing
被设置为了 YES
,那么 completionHandler
就不会被触发。
POST/PUT/DELETE 只需把 GET 换成对应的 HTTP Method 即可。
startImmediately
如果设为 NO
,那么这个请求不会被发送,可以将来通过调用 -[MGJRequestManager startOperation:]
来发送,或者也可以放到队列里。
这里会传入默认的 configuration,如果需要在这个请求做一些个性化设置,可以修改 configuration 里相应地配置。
这里的 result
就是 -[MGJResponse result]
, error
是 -[MGJResponse error]
, isFromCache
表示这个结果是否来自缓存。
前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是:先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。其中,AlexNet和VGG对LeNet的改进主要在于如何对这两个模块加宽(增加通道数)和加深。本节我们介绍网络中的网络(NiN)[1]。它提出了另外一个思路,即串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络。 NiN块 我们知道,卷积层
在 libuv 中,网络编程与直接使用 BSD socket 区别不大,有些地方还更简单,概念保持不变的同时,libuv 上所有接口都是非阻塞的。它还提供了很多工具函数,抽象了恼人、啰嗦的底层任务,如使用 BSD socket 结构体设置 socket 、DNS 查找以及调整各种 socket 参数。 在网络I/O中会使用到uv_tcp_t和uv_udp_t。 note 本章中的代码片段仅用于展示
1 三次握手 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三次握手的一部分。客户端把这段连接的序号设定为随机数 A。 服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK 的确认码应为 A+1,SYN/ACK 包本身又有一个随机序号 B。 最后,客户端再发送一个ACK。当服务端受到这个ACK的时候,就完成了三路握手,并进入了连接创建状态。此时包序号被设定为收到的确认号 A+1
网络 [IPV6] ipv6.disable={0|1} ipv6.disable_ipv6={0|1} 是否在所有网络接口上禁用IPv6支持:0(默认值)表示在所有网络接口上开启IPv6支持;1 表示在所有网络接口上关闭IPv6支持。建议使用"ipv6.disable=1"(彻底禁用ipv6内核模块) [IPV6] ipv6.autoconf={0|1} 是否在所有网络接口上开启IPv6地址自动
帮助用户解决网络方面的问题,涵盖VPC、二层网络、IP子网、域名服务、安全组、弹性网卡、EIP、负载均衡内容。 网络管理包括哪些内容? 主要包括VPC、二层网络、IP子网、预留IP、安全组、EIP、弹性网卡、密钥、域名服务等方面内容。 产品支持哪些速率的网络接口? 支持40G、千兆、万兆等速率的网络接口,实际生产环境建议千兆以上。 管理网络和数据网络放在一起会影响吗? 建议将管理网络和数据网络分离
网络主要包括基础网络和负载均衡,其中基础网络包括VPC、路由表、二层网络、IP子网等;负载均衡包括负载均衡集群和实例等。 地域 地域包括区域和可用区,代表资源的物理位置。 基础网络 基础网络主要用于为宿主机、计算主机等提供IP地址资源等。主要包括全局VPC、VPC、、二层网络、IP子网、预留IP。 网络服务 网络服务提供弹性公网IP、NAT网关、DNS解析等功能。 网络安全 网络安全目前包括WAF
包括安全组、IP子网、弹性公网IP的内容。 安全组 安全组是一种虚拟的包过滤防火墙,通过设置安全组出入方向的规则来控制关联的虚拟机的访问策略。如控制虚拟机是否被其他网络可以被访问,以及虚拟机可访问的外部资源等。 IP子网 IP子网用于为虚拟机、宿主机等资源提供IP地址。 弹性公网IP 弹性公网IP(Elastic IP)是一种NAT IP,通过与虚拟机绑定,将弹性公网IP与虚拟机的私有地址进行NA
发起请求 request 基础库1.3.9开始支持,iOS版本2.1.23,Android版本2.1.38 request(Object object) 利用原生Api发起HTTP网络请求,执行后返回 RequestTask 对象。 参数 Object object 属性 类型 默认值 必填 说明 url string 是 开发者服务器接口地址 data string/object/ArrayBu