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

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

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

下边我们要定义的是

block

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

请求超出时间

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

POST请求参数的处理

//处理POST请求方式的参数
NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
if (comparRet2==NSOrderedSame) {
NSArray *allkeys=[params allKeys];
for (int i=; i<params.count; i++) {
NSString *key=[allkeys objectAtIndex:i];
id value=[params objectForKey:key]; //判断是否文件上传
if ([value isKindOfClass:[NSData class]]) {
[request addData:value forKey:key];
}else{
[request addPostValue:value forKey:key];
}
}
}

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

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

//定义block
__block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
//设置请求超出时间
[request setTimeOutSeconds:];
//设置请求方式
[request setRequestMethod:httpMethod]; //处理POST请求方式的参数
NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
if (comparRet2==NSOrderedSame) {
NSArray *allkeys=[params allKeys];
for (int i=; i<params.count; i++) {
NSString *key=[allkeys objectAtIndex:i];
id value=[params objectForKey:key]; //判断是否文件上传
if ([value isKindOfClass:[NSData class]]) {
[request addData:value forKey:key];
}else{
[request addPostValue:value forKey:key];
}
}
}

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的解析方法:

[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参数。

//设置请求完成的block
[request setCompletionBlock:^{
NSData *data = request.responseData;
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
id result = nil;
//解析json数据集 //判断系统是否5.0或以上版本
if (version >= 5.0) {
//系统版本是5.0或以上版本执行此段代码
//这种是ios5.0时,apple新加的一个功能
result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; }else{
//第三方json解析方法
result=[data objectFromJSONData];
} if (block!=nil) {
block(result);
}
}]; //开始异步请求 异步 startAsynchronous 同步 startSynchronous
[request startAsynchronous];

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

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

ZWJDataService.h
//
// ZWJDataService.h
// 1.FrontTableViewDome
//
// Created by 张文健 on 14-3-14.
// Copyright (c) 2014年 张文健. All rights reserved.
// #import <Foundation/Foundation.h>
#import "ASIFormDataRequest.h" //block定义
typedef void(^RequestFinishBlock)(id result); @interface ZWJDataService : NSObject //定义接口
+(ASIHTTPRequest *)requestWithURL:(NSString *)urlstring
params:(NSMutableDictionary *)params
httpMethod:(NSString *)httpMethod
completeBlock:(RequestFinishBlock)block; @end
ZWJDataService.m
//
// ZWJDataService.m
// 1.FrontTableViewDome
//
// Created by 张文健 on 14-3-14.
// Copyright (c) 2014年 张文健. All rights reserved.
// #define BASE_URL @"http://**********/api/" #import "ZWJDataService.h"
#import "JSONKit.h" @implementation ZWJDataService +(ASIHTTPRequest *)requestWithURL:(NSString *)urlstring
params:(NSMutableDictionary *)params
httpMethod:(NSString *)httpMethod
completeBlock:(RequestFinishBlock)block{
//拼接URL字符串
urlstring=[BASE_URL stringByAppendingFormat:@"%@?access_token=aa",urlstring]; NSLog(@"urlStr : %@ ",urlstring); //处理GET请求的参数
NSComparisonResult comparRet1=[httpMethod caseInsensitiveCompare:@"GET"];
if(comparRet1==NSOrderedSame){
NSMutableString *paramsString=[NSMutableString string];
NSArray *allkeys=[params allKeys];
NSLog(@"parms : %@ \r\n",params);
for (int i=; i<params.count; i++) {
NSString *key=[allkeys objectAtIndex:i];
id value=[params objectForKey:key]; [paramsString appendFormat:@"%@=%@",key,value]; if (i<params.count-) {
[paramsString appendFormat:@"&"];
}
NSLog(@"paramsString : %@ ",paramsString); } if (paramsString.length>) {
urlstring=[urlstring stringByAppendingFormat:@"&%@",paramsString];
}
}
NSURL *url=[NSURL URLWithString:urlstring]; NSLog(@"URL : %@ ",url);
//定义block
__block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
//设置请求超出时间
[request setTimeOutSeconds:];
//设置请求方式
[request setRequestMethod:httpMethod]; //处理POST请求方式的参数
NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
if (comparRet2==NSOrderedSame) {
NSArray *allkeys=[params allKeys];
for (int i=; i<params.count; i++) {
NSString *key=[allkeys objectAtIndex:i];
id value=[params objectForKey:key]; //判断是否文件上传
if ([value isKindOfClass:[NSData class]]) {
[request addData:value forKey:key];
}else{
[request addPostValue:value forKey:key];
}
}
} //设置请求完成的block
[request setCompletionBlock:^{
NSData *data = request.responseData;
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
id result = nil;
//解析json数据集 //判断系统是否5.0或以上版本
if (version >= 5.0) {
//系统版本是5.0或以上版本执行此段代码
//这种是ios5.0时,apple新加的一个功能
result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; }else{
//第三方json解析方法
result=[data objectFromJSONData];
} if (block!=nil) {
block(result);
}
}]; //开始异步请求 异步 startAsynchronous 同步 startSynchronous
[request startAsynchronous]; return request;
} @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. MySQL系列:一句SQL,MySQL是怎么工作的?

    对于MySQL而言,其实分为客户端与服务端. 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端. 客户端,负责发送请求到服务端并从服 ...

  2. Java程序线上故障排查

    目录 一.Linux 内存和cpu 网络 磁盘 /proc文件系统 二.JVM Java堆和垃圾收集器 gc日志分析 JVMTI介绍 Attach机制 java自带工具 三.三方工具 jprofile ...

  3. ajax传出数组到后台

    var vote = new Array();    $("input[name='option_name']").each(function(i){        if($(th ...

  4. PHP+Swoole并发编程的魅力

    PHP语言是一个短生命周期的Web编程语言,很多PHPer已经形成了fpm下编程的思维定势.实际上在Swoole出现之后,这种串行化编程的模式早已被打破.使用Swoole完全可以轻易实现更灵活的并发编 ...

  5. 微信web协议,群成员唯一uin,获取群成员唯一标识

    群成员唯一标识获取接口 全网最新,支持调试测试.觉得OK再付款! 800元出售源码 不讲价 联系QQ:2052404477

  6. 这份最新Python面试精选问题你会几道?

    相信很多小伙伴学python以后都想进大厂,但是进大厂前你得了解些大厂面试题,可以在面试前复习下,以下是精选的5道python面试题: 第一. Python 的特点和优点是什么? Python 可以作 ...

  7. nyoj 412 Same binary weight ()

    Same binary weight 时间限制:300 ms  |  内存限制:65535 KB 难度:3   描述 The binary weight of a positive  integer ...

  8. lqb 基础练习 闰年判断

    基础练习 闰年判断 时间限制:1.0s   内存限制:256.0MB     问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍 ...

  9. 力扣(LeetCode)第一个错误的版本 个人题解

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  10. SoapUI使用JDBC请求连接数据库及断言的使用

    SoapUI提供了用来配置JDBC数据库连接的选项,因此我们可以在测试中使用JDBC数据源.JDBC数据接收器和JDBC请求步骤. 为了能够配置数据连接,就必须有驱动程序和连接串,SoapUI中已经提 ...