最近一直很忙也没有什么时间写博客了。放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!!

首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服务器进行交互。

那个我们和服务器怎么交互呢?最简单的方式就是说话呗,但是我们要跟服务器说话必须通过我们彼此能听的懂的话来交流,也就需要制定很多的协议了(http,tcp,udp等,这个有兴趣的朋友可以了解一下网络协议的东西)。但是我平常最常使用的还是http协议。

http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html这篇博客详细讲解了http协议的东西(我能说是我随便百度了一篇博客吗?)

然后github上的AFNetworking应该现在是应用的最广泛的网络请求三方库了吧。那么今天就来说一下AFNetworing。

既然人家已经封装的这么好了,我们为什么还要多此一举再封装呢?

那现在就来说一下再封装的意义是什么?

最重要的意义差不多就是统一接口(这个也是封装的一个作用,如果不了解封装的同学可以去看看封装的用处,是个提高效率的非常有效的办法),这一点要是再多人项目中尤其能体现出来,我的一个同事用的是系统自带的MKNetworking,很多人可能听都没听过,他虽然用的很好,我也能看的懂,但是还是感觉看起来很难受,因为我根本不想看到他的具体用法和实现是什么样子的(虽然真正敲起来可能也只是多了两行代码而已),只需要调一个接口就什么都用了不就好了,为什么还要敲那么多重复的代码呢(Don't repeat yourself)?

好,下面我就来对AFNetworking再封装:

首先,还是说一下封装的事情,如果是你自己用,那么你可以随便写一写,因为你不用注释也能看的懂。但是如果是给几个人用,你可以直接告诉他们,或者说是写一个比较详细的注释,以便他们日后忘记了看一下就知道每个参数的意义是什么了!!!我将网络请求封装成了单例,详细代码见下:

那么我在网络请求的时候究竟最常用的网络请求有哪些呢?

我最常用到的就是get,post,upload及download了。(这几中请求方式也可以去了解一下他们的区别)

说了这么多的废话了来点干货。

上传文件的参数文件UploadParam.h:

  1. @interface UploadParam : NSObject
  2. /**
  3. * 图片的二进制数据
  4. */
  5. @property (nonatomic, strong) NSData *data;
  6. /**
  7. * 服务器对应的参数名称
  8. */
  9. @property (nonatomic, copy) NSString *name;
  10. /**
  11. * 文件的名称(上传到服务器后,服务器保存的文件名)
  12. */
  13. @property (nonatomic, copy) NSString *filename;
  14. /**
  15. * 文件的MIME类型(image/png,image/jpg等)
  16. */
  17. @property (nonatomic, copy) NSString *mimeType;
  18.  
  19. @end

HttpRequest.h的申明:

  1. @class UploadParam;
  2. /**
  3. * 网络请求类型
  4. */
  5. typedef NS_ENUM(NSUInteger,HttpRequestType) {
  6. /**
  7. * get请求
  8. */
  9. HttpRequestTypeGet = ,
  10. /**
  11. * post请求
  12. */
  13. HttpRequestTypePost
  14. };
  15.  
  16. @interface HttpRequest : NSObject
  17.  
  18. + (instancetype)sharedInstance;
  19.  
  20. /**
  21. * 发送get请求
  22. *
  23. * @param URLString 请求的网址字符串
  24. * @param parameters 请求的参数
  25. * @param success 请求成功的回调
  26. * @param failure 请求失败的回调
  27. */
  28. - (void)getWithURLString:(NSString *)URLString
  29. parameters:(id)parameters
  30. success:(void (^)(id responseObject))success
  31. failure:(void (^)(NSError *error))failure;
  32.  
  33. /**
  34. * 发送post请求
  35. *
  36. * @param URLString 请求的网址字符串
  37. * @param parameters 请求的参数
  38. * @param success 请求成功的回调
  39. * @param failure 请求失败的回调
  40. */
  41. - (void)postWithURLString:(NSString *)URLString
  42. parameters:(id)parameters
  43. success:(void (^)(id responseObject))success
  44. failure:(void (^)(NSError *error))failure;
  45.  
  46. /**
  47. * 发送网络请求
  48. *
  49. * @param URLString 请求的网址字符串
  50. * @param parameters 请求的参数
  51. * @param type 请求的类型
  52. * @param resultBlock 请求的结果
  53. */
  54. - (void)requestWithURLString:(NSString *)URLString
  55. parameters:(id)parameters
  56. type:(HttpRequestType)type
  57. success:(void (^)(id responseObject))success
  58. failure:(void (^)(NSError *error))failure;
  59.  
  60. /**
  61. * 上传图片
  62. *
  63. * @param URLString 上传图片的网址字符串
  64. * @param parameters 上传图片的参数
  65. * @param uploadParam 上传图片的信息
  66. * @param success 上传成功的回调
  67. * @param failure 上传失败的回调
  68. */
  69. - (void)uploadWithURLString:(NSString *)URLString
  70. parameters:(id)parameters
  71. uploadParam:(NSArray <UploadParam *> *)uploadParams
  72. success:(void (^)())success
  73. failure:(void (^)(NSError *error))failure;
  74.  
  75. /**
  76. * 下载数据
  77. *
  78. * @param URLString 下载数据的网址
  79. * @param parameters 下载数据的参数
  80. * @param success 下载成功的回调
  81. * @param failure 下载失败的回调
  82. */
  83. - (void)downLoadWithURLString:(NSString *)URLString
  84. parameters:(id)parameters
  85. progerss:(void (^)())progress
  86. success:(void (^)())success
  87. failure:(void (^)(NSError *error))failure;
  88.  
  89. @end
  1. @implementation HttpRequest
  2.  
  3. static id _instance = nil;
  4. + (instancetype)sharedInstance {
  5. return [[self alloc] init];
  6. }
  7.  
  8. + (instancetype)allocWithZone:(struct _NSZone *)zone {
  9. static dispatch_once_t onceToken;
  10. dispatch_once(&onceToken, ^{
  11. _instance = [super allocWithZone:zone];
  12. });
  13. return _instance;
  14. }
  15.  
  16. - (instancetype)init {
  17. static dispatch_once_t onceToken;
  18. dispatch_once(&onceToken, ^{
  19. _instance = [super init];
  20. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  21. [manager startMonitoring];
  22. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  23. switch (status) {
  24. case AFNetworkReachabilityStatusUnknown:
  25. {
  26. // 位置网络
  27. NSLog(@"位置网络");
  28. }
  29. break;
  30. case AFNetworkReachabilityStatusNotReachable:
  31. {
  32. // 无法联网
  33. NSLog(@"无法联网");
  34. }
  35. break;
  36. case AFNetworkReachabilityStatusReachableViaWiFi:
  37. {
  38. // 手机自带网络
  39. NSLog(@"当前使用的是2G/3G/4G网络");
  40. }
  41. break;
  42. case AFNetworkReachabilityStatusReachableViaWWAN:
  43. {
  44. // WIFI
  45. NSLog(@"当前在WIFI网络下");
  46. }
  47. }
  48. }];
  49. });
  50. return _instance;
  51. }
  52.  
  53. #pragma mark -- GET请求 --
  54. - (void)getWithURLString:(NSString *)URLString
  55. parameters:(id)parameters
  56. success:(void (^)(id))success
  57. failure:(void (^)(NSError *))failure {
  58.  
  59. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  60. /**
  61. * 可以接受的类型
  62. */
  63. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  64. /**
  65. * 请求队列的最大并发数
  66. */
  67. // manager.operationQueue.maxConcurrentOperationCount = 5;
  68. /**
  69. * 请求超时的时间
  70. */
  71. manager.requestSerializer.timeoutInterval = ;
  72. [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  73. if (success) {
  74. success(responseObject);
  75. }
  76. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  77. if (failure) {
  78. failure(error);
  79. }
  80. }];
  81. }
  82.  
  83. #pragma mark -- POST请求 --
  84. - (void)postWithURLString:(NSString *)URLString
  85. parameters:(id)parameters
  86. success:(void (^)(id))success
  87. failure:(void (^)(NSError *))failure {
  88.  
  89. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  90. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  91. [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  92. if (success) {
  93. success(responseObject);
  94. }
  95. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  96. if (failure) {
  97. failure(error);
  98. }
  99. }];
  100. }
  101.  
  102. #pragma mark -- POST/GET网络请求 --
  103. - (void)requestWithURLString:(NSString *)URLString
  104. parameters:(id)parameters
  105. type:(HttpRequestType)type
  106. success:(void (^)(id))success
  107. failure:(void (^)(NSError *))failure {
  108.  
  109. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  110. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  111. switch (type) {
  112. case HttpRequestTypeGet:
  113. {
  114. [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  115. if (success) {
  116. success(responseObject);
  117. }
  118. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  119. if (failure) {
  120. failure(error);
  121. }
  122. }];
  123. }
  124. break;
  125. case HttpRequestTypePost:
  126. {
  127. [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  128. if (success) {
  129. success(responseObject);
  130. }
  131. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  132. if (failure) {
  133. failure(error);
  134. }
  135. }];
  136. }
  137. break;
  138. }
  139. }
  140.  
  141. - (void)uploadWithURLString:(NSString *)URLString parameters:(id)parameters uploadParam:(NSArray<UploadParam *> *)uploadParams success:(void (^)())success failure:(void (^)(NSError *))failure {
  142. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  143. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  144. [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  145. for (UploadParam *uploadParam in uploadParams) {
  146. [formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.filename mimeType:uploadParam.mimeType];
  147. }
  148. } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  149. if (success) {
  150. success(responseObject);
  151. }
  152. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  153. if (failure) {
  154. failure(error);
  155. }
  156. }];
  157. }
  158.  
  159. #pragma mark - 下载数据
  160. - (void)downLoadWithURLString:(NSString *)URLString parameters:(id)parameters progerss:(void (^)())progress success:(void (^)())success failure:(void (^)(NSError *))failure {
  161. AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
  162. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];
  163. NSURLSessionDownloadTask *downLoadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
  164. if (progress) {
  165. progress();
  166. }
  167. } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
  168. return targetPath;
  169. } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
  170. if (failure) {
  171. failure(error);
  172. }
  173. }];
  174. [downLoadTask resume];
  175. }
  176.  
  177. @end
  1. 我把我的demo也传到我的git上了,欢迎大家下载,下载地址为:https://git.oschina.net/wuhongxing/HXNetWorking.git。我用的是cocospod导入三方库的,如果下载了不能使用的,也可以联系我!

iOS开发之网络请求(基于AFNetworking的再封装)的更多相关文章

  1. IOS开发之网络开发工具

    IOS开发之网络开发工具 做移动端开发  常常会涉及到几个模块:1.网络检測   2.网络请求get和post请求  3.文件上传  4.文件下载   5.断点续传 如今将这些一一分享给大家 ,也欢迎 ...

  2. iOS开发 支持https请求以及ssl证书配置(转)

    原文地址:http://blog.5ibc.net/p/100221.html 众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https 楼主正好近日将http转为https,给还没 ...

  3. iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

    前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...

  4. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  5. iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

    前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...

  6. iOS开发之网络编程--使用NSURLConnection实现文件上传

    前言:使用NSURLConnection实现文件上传有点繁琐.    本文并没有介绍使用第三方框架上传文件. 正文: 这里先提供用于编码测试的接口:http://120.25.226.186:3281 ...

  7. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  8. iOS开发之网络编程--小文件下载

    文件下载方式: 如果下载的文件比较小,下载方式: 直接用NSData的 +(id)dataWithContentsOfURL:(NSURL*)url; 利用NSURLConnection发送一个HTT ...

  9. iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载

    本文内容大纲: 1.回顾NSURLSessionTask 2.NSURLSessionDownloadTask大文件之block下载 3.NSURLSessionDownloadTask大文件之代理方 ...

随机推荐

  1. Ubuntu下嵌入式Qt开发环境配置全攻略

    http://qpcwth.blog.163.com/blog/static/20993024620139151424822/ 在安装的过称中,出现一些问题,注意试想: 1.本次开发环境的配置,是基于 ...

  2. Java - 注解 (Annotation)

    Java - 注解 (Annotation)   一.基本的 Annotation     > 使用 Annotation 时要在其前面增加 @符号,并把该 Annotation 当成一个修饰符 ...

  3. Android开发错误汇总

    [错误信息] [2011-01-19 16:39:10 - ApiDemos] WARNING: Application does not specify an API level requireme ...

  4. Android studio教程:[4]真机测试

    有了Android studio这么好用的软件,自然要有一部不错的安卓手机,然后在真机上测试自己的程序,那样才能更好的发现程序中存在的问题,毕竟模拟器不是真正的手机嘛. 工具/原料 Android s ...

  5. Android studio教程:[3]修改背景主题

    android studio开发环境的背景主题是可以更改的,现在都流行黑色背景,这样让软件显得更高端大气的,更加赏心悦目,但最主要的还是看起来更舒适更顺眼.下面就教大家如何更改背景主题. 工具/原料 ...

  6. Ubuntu第一次使用调教教程

    Ubuntu第一次使用调教教程 Ubuntu不允许root用户登录,这让人很蛋疼.下面的方法就是让Ubuntu接受以root身份登录.此外,ubuntu默认没有安装ssh的,所以不能进行ssh远程登录 ...

  7. Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的用于开发动态web资源的技术.Sun公司在其API中提供了一个Servlet接口,用户若想开发一个动态web资源(即开发一个java程序向浏览器 ...

  8. 如何设置 Internal 类,方法,属性对其他项目可见

    internal 修饰符时程序集内部其他类可见.但对程序集外的类不可见,这样就很好的封装了可见性. 但是,我们也许会碰到类似的情况,特别是基于已有代码开发新的代码时,你会发现很多 internal 的 ...

  9. C# 如何获取当前应用程序的父目录

    //获取当前运行路径的上级目录(父目录) System.IO.DirectoryInfo topDir = System.IO.Directory.GetParent(System.Environme ...

  10. c++ 17介绍

    作者:hearts zh链接:https://www.zhihu.com/question/32222337/answer/55238928来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...