接着上次的讲,这次我们讲 网络请求的封装  打开创建的项目,让我们一起来继续完成他,

上次我们说到GET请求地址的拼接;

我们接着上次的继续完善;

下边我们要定义的是

block

  1. //定义block
  2. __block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];

请求超出时间

  1. //设置请求超出时间
  2. [request setTimeOutSeconds:];

POST请求参数的处理

  1. //处理POST请求方式的参数
  2. NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
  3. if (comparRet2==NSOrderedSame) {
  4. NSArray *allkeys=[params allKeys];
  5. for (int i=; i<params.count; i++) {
  6. NSString *key=[allkeys objectAtIndex:i];
  7. id value=[params objectForKey:key];
  8.  
  9. //判断是否文件上传
  10. if ([value isKindOfClass:[NSData class]]) {
  11. [request addData:value forKey:key];
  12. }else{
  13. [request addPostValue:value forKey:key];
  14. }
  15. }
  16. }

POST里边涉及到的知识点,在GET上边已经提到,在这里就不做赘述;

把这段这个代码贴出来看一下:

  1. //定义block
  2. __block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
  3. //设置请求超出时间
  4. [request setTimeOutSeconds:];
  5. //设置请求方式
  6. [request setRequestMethod:httpMethod];
  7.  
  8. //处理POST请求方式的参数
  9. NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
  10. if (comparRet2==NSOrderedSame) {
  11. NSArray *allkeys=[params allKeys];
  12. for (int i=; i<params.count; i++) {
  13. NSString *key=[allkeys objectAtIndex:i];
  14. id value=[params objectForKey:key];
  15.  
  16. //判断是否文件上传
  17. if ([value isKindOfClass:[NSData class]]) {
  18. [request addData:value forKey:key];
  19. }else{
  20. [request addPostValue:value forKey:key];
  21. }
  22. }
  23. }

block执行完以后就该处理json 返回数据

接下来,就是请求完成后的操作了

我们要设置请求完成的block

block中返回的数据是json格式的首先我们要把他转化成自己熟悉的格式

就是类似于在C#里边是Dictionary键值对字典 NSMutableDictionary ;

那么我们就不得不又要扩展一下了,解析json有两种方法:原生的  或者  第三方的

NSJSONSerialization:

ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。既然apple为我们提供了这么良好的工具,我们没理由不用吧。

NSJSONSerialization提供了将JSON数据转换为Foundation对象(一般都是NSDictionary和NSArray)和Foundation对象转换为JSON数据(可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据)。

JSONKit:

JSONKIT是Object-C一个处理json数据的库,非常高效而且易用,对比同类型的库有非常明显的性能优势

JSONDecoder的解析方法:

  1. [JSONDecoder decoderWithParseOptions:parseOptionFlags]) mutableObjectWithData:self error:error];

总的来说,JSONKit对

NSArray

NSString

NSData

NSDictionary

都进行了序列化和反序列化的扩展,可以把这些对象与JSON对象之间相互转换。

由于JSONKit没有使用ARC,所以使用时不要忘了在build phases -》compile sources 选择文件后面加-fno-objc-arc参数。

在这里还要注明一下:在创建的arc项目中如果用到了非arc的类库或者是插件,都要添加-fno-objc-arc参数。

  1. //设置请求完成的block
  2. [request setCompletionBlock:^{
  3. NSData *data = request.responseData;
  4. float version = [[[UIDevice currentDevice] systemVersion] floatValue];
  5. id result = nil;
  6. //解析json数据集
  7.  
  8. //判断系统是否5.0或以上版本
  9. if (version >= 5.0) {
  10. //系统版本是5.0或以上版本执行此段代码
  11. //这种是ios5.0时,apple新加的一个功能
  12. result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
  13.  
  14. }else{
  15. //第三方json解析方法
  16. result=[data objectFromJSONData];
  17. }
  18.  
  19. if (block!=nil) {
  20. block(result);
  21. }
  22. }];
  23.  
  24. //开始异步请求 异步 startAsynchronous 同步 startSynchronous
  25. [request startAsynchronous];

到这里 网络请求的封装就完了

这里我这个把代码贴一下出来

  1. ZWJDataService.h
  1. //
  2. // ZWJDataService.h
  3. // 1.FrontTableViewDome
  4. //
  5. // Created by 张文健 on 14-3-14.
  6. // Copyright (c) 2014年 张文健. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10. #import "ASIFormDataRequest.h"
  11.  
  12. //block定义
  13. typedef void(^RequestFinishBlock)(id result);
  14.  
  15. @interface ZWJDataService : NSObject
  16.  
  17. //定义接口
  18. +(ASIHTTPRequest *)requestWithURL:(NSString *)urlstring
  19. params:(NSMutableDictionary *)params
  20. httpMethod:(NSString *)httpMethod
  21. completeBlock:(RequestFinishBlock)block;
  22.  
  23. @end
  1. ZWJDataService.m
  1. //
  2. // ZWJDataService.m
  3. // 1.FrontTableViewDome
  4. //
  5. // Created by 张文健 on 14-3-14.
  6. // Copyright (c) 2014年 张文健. All rights reserved.
  7. //
  8.  
  9. #define BASE_URL @"http://**********/api/"
  10.  
  11. #import "ZWJDataService.h"
  12. #import "JSONKit.h"
  13.  
  14. @implementation ZWJDataService
  15.  
  16. +(ASIHTTPRequest *)requestWithURL:(NSString *)urlstring
  17. params:(NSMutableDictionary *)params
  18. httpMethod:(NSString *)httpMethod
  19. completeBlock:(RequestFinishBlock)block{
  20. //拼接URL字符串
  21. urlstring=[BASE_URL stringByAppendingFormat:@"%@?access_token=aa",urlstring];
  22.  
  23. NSLog(@"urlStr : %@ ",urlstring);
  24.  
  25. //处理GET请求的参数
  26. NSComparisonResult comparRet1=[httpMethod caseInsensitiveCompare:@"GET"];
  27. if(comparRet1==NSOrderedSame){
  28. NSMutableString *paramsString=[NSMutableString string];
  29. NSArray *allkeys=[params allKeys];
  30. NSLog(@"parms : %@ \r\n",params);
  31. for (int i=; i<params.count; i++) {
  32. NSString *key=[allkeys objectAtIndex:i];
  33. id value=[params objectForKey:key];
  34.  
  35. [paramsString appendFormat:@"%@=%@",key,value];
  36.  
  37. if (i<params.count-) {
  38. [paramsString appendFormat:@"&"];
  39. }
  40. NSLog(@"paramsString : %@ ",paramsString);
  41.  
  42. }
  43.  
  44. if (paramsString.length>) {
  45. urlstring=[urlstring stringByAppendingFormat:@"&%@",paramsString];
  46. }
  47. }
  48. NSURL *url=[NSURL URLWithString:urlstring];
  49.  
  50. NSLog(@"URL : %@ ",url);
  51. //定义block
  52. __block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
  53. //设置请求超出时间
  54. [request setTimeOutSeconds:];
  55. //设置请求方式
  56. [request setRequestMethod:httpMethod];
  57.  
  58. //处理POST请求方式的参数
  59. NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
  60. if (comparRet2==NSOrderedSame) {
  61. NSArray *allkeys=[params allKeys];
  62. for (int i=; i<params.count; i++) {
  63. NSString *key=[allkeys objectAtIndex:i];
  64. id value=[params objectForKey:key];
  65.  
  66. //判断是否文件上传
  67. if ([value isKindOfClass:[NSData class]]) {
  68. [request addData:value forKey:key];
  69. }else{
  70. [request addPostValue:value forKey:key];
  71. }
  72. }
  73. }
  74.  
  75. //设置请求完成的block
  76. [request setCompletionBlock:^{
  77. NSData *data = request.responseData;
  78. float version = [[[UIDevice currentDevice] systemVersion] floatValue];
  79. id result = nil;
  80. //解析json数据集
  81.  
  82. //判断系统是否5.0或以上版本
  83. if (version >= 5.0) {
  84. //系统版本是5.0或以上版本执行此段代码
  85. //这种是ios5.0时,apple新加的一个功能
  86. result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
  87.  
  88. }else{
  89. //第三方json解析方法
  90. result=[data objectFromJSONData];
  91. }
  92.  
  93. if (block!=nil) {
  94. block(result);
  95. }
  96. }];
  97.  
  98. //开始异步请求 异步 startAsynchronous 同步 startSynchronous
  99. [request startAsynchronous];
  100.  
  101. return request;
  102. }
  103.  
  104. @end

大家就可以运用这个封装好的网络请求,来做一些小的测试,把数据nslog出来;

如果觉得有用的话,别忘了推荐一下哦,共同学习,共同进步!

专注技术

作者:zhangwenjian
出处:http://www.cnblogs.com/zhangwenjian

转移:http://www.zhangwj.com

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

移动开发在路上-- IOS移动开发 五 网络请求封装的更多相关文章

  1. 移动开发在路上-- IOS移动开发系列 多线程二

    最近太忙没太多的时间,忙碌的码农生活空下来一点时间,都会挤出来看一些技术或者咨询的文章,废话不多说,直奔主题. 接着上一次的继续说. 定时器在多线程的使用 NSRunLoop 是线程相关的基础框架的一 ...

  2. 移动开发在路上-- IOS移动开发系列 网络交互四(1)

    最近一段时间上班忙的没日没夜的,不是披星戴月,就是头天早上出门,第二天早上回家...一直没出处时间来更新博客,码农之苦,说了都是泪,废话不多说,直接本主题,经过之前三篇的讲述,ios开发的东西大家或多 ...

  3. 移动开发在路上-- IOS移动开发系列 多线程一

    类似于什么是进程什么是线程在这里我就不多浪费时间了(Google一下什么都有)! 废话不多说先上图,我相信大家都是喜欢看图的人,俗话说得好,求图求真相吗?虽然这里只有屌丝一个但是真相还是会有的... ...

  4. 移动开发在路上-- IOS移动开发系列 多线程三

    这一次说一点概念性的东西,也是为后边做一些基础 HTTP协议的基本概念 http协议的基本概念 全称“超文本传输协议”,浏览器和服务器之间的通信规则 HTTp协议永远都是客户端发起的请求,服务器回送响 ...

  5. 移动开发在路上-- IOS移动开发系列 网络交互四(2)

    接着上次的讲,这次我们讲 网络请求的封装  打开创建的项目,让我们一起来继续完成他, 首先我们来创建一个NSobject 的文件 圈住出来的轻一点要注意.千万不要搞错了 创建好之后,开始编写代码, 我 ...

  6. iOS开发--Swift 基于AFNetworking 3.0的网络请求封装

    Swift和OC基于AFNetworking的网络请求流程相同, 就是语法不同, 对于Swift语法不是很清楚的同学, 建议多看看API文档, 自己多多尝试. 写过OC的应该都明白每句话做什么的, 就 ...

  7. iOS开发——post异步网络请求封装

    IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异 ...

  8. Flutter 实际开发常用工具类(全局提示,请求封装,token缓存,验证码倒计时、常用窗帘动画及布局)

    介绍: 一星期从入门到实际开发经验分享及总结           代码传送门github Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.未来App开发 ...

  9. Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的

    在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到Afinal框架,不会用Afinal的童鞋可以先看一下上一篇博文),正所谓麻雀虽小,五脏俱全,这在里我会尽量 ...

随机推荐

  1. UML简明使用

    1.继承 空心三角+实线 2.实现接口 空心三角+虚线 3.关联 箭头+实线 4.聚合 空心菱形+实线+箭头 5.组合 实心菱形+实线+箭头 6.依赖 虚线+箭头 7.关联.聚合.组合.依赖的区别 关 ...

  2. T-SQL Part XII: Access Remote SQL Server

    要链接远程的SQL Server,需要一下几个步骤(以下的步骤都是在远程系统上进行): 确认远程SQL Server所监听的端口号 官方的文档是使用SQL Server Configuration M ...

  3. [复现论文程序图]High Speed Continuous Variable Source-Independent Quantum Random Number Generation

    这次的任务是复现该文章的图2(C),过程如下. ①翻译了整篇文章,断断续续,花了3-4天时间. ②阅读文章,并且记录下每个符号的意义,记在单独的1个word文档里. ③开始编程,用的matlab201 ...

  4. 【SpringBoot | Druid】SpringBoot整合Druid

    SpringBoot整合Druid Druid是个十分强大的后端管理工具,具体的功能和用途请问阿里爸爸 1. 在pom.xml中导入包 <!-- alibaba 的druid数据库连接池 --& ...

  5. CentOS 7安装图形界面步骤和问题解决方法

    CentOS 7图形安装步骤: 首先需要进行必要的图形组件安装--命令为: yum groupinstall "X Window System " yum groupinstall ...

  6. 🙈羞,Spring Bean 初始化/销毁竟然有这么多姿势

    文章来源:http://1t.click/bfHN 一.前言 日常开发过程有时需要在应用启动之后加载某些资源,或者在应用关闭之前释放资源.Spring 框架提供相关功能,围绕 Spring Bean ...

  7. d3.js 地铁轨道交通项目实战

    上一章说了如何制作一个线路图,当然上一章是手写的JSON数据,当然手写的json数据有非常多的好处,例如可以应对客户的各种BT需求,但是大多数情况下我们都是使用地铁公司现成的JSON文件,话不多说我们 ...

  8. git 删除误上传的.idea文件

    问题: 提交项目的时候忘记添加.gitignore文件,误上传了文件(如.idea)如何解决?(本文以.idea文件夹举例) 1.将项目文件拉取下来 git pull origin master 2. ...

  9. 教你用Java web实现多条件过滤功能

    生活中,当你闲暇之余浏览资讯的时候,当你搜索资料但繁杂信息夹杂时候,你就会想,如何更为准确的定位需求信息.今天就为你带来: 分页查询 需求分析:在列表页面中,显示指定条数的数据,通过翻页按钮完成首页/ ...

  10. sign in with apple后端校验(java)

    最近新开发的ios平台的app在提审的时候,被拒了,原因是app上如果有接第三方登陆(比如,微信,微博,facebook等),那就必须要接apple id登陆,坑爹~苹果霸权啊!然而没办法,靠他吃饭, ...