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

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

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

我们接着昨天的继续完善;

下边我们要定义的是

block

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

请求超出时间

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

POST请求参数的处理


//处理POST请求方式的参数
NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
if (comparRet2==NSOrderedSame) {
NSArray *allkeys=[params allKeys];
for (int i=0; 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:60];
//设置请求方式
[request setRequestMethod:httpMethod];

//处理POST请求方式的参数
NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
if (comparRet2==NSOrderedSame) {
NSArray *allkeys=[params allKeys];
for (int i=0; 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=0; i<params.count; i++) {
NSString *key=[allkeys objectAtIndex:i];
id value=[params objectForKey:key];

[paramsString appendFormat:@"%@=%@",key,value];

if (i<params.count-1) {
[paramsString appendFormat:@"&"];
}
NSLog(@"paramsString : %@ ",paramsString);

}

if (paramsString.length>0) {
urlstring=[urlstring stringByAppendingFormat:@"&%@",paramsString];
}
}
NSURL *url=[NSURL URLWithString:urlstring];

NSLog(@"URL : %@ ",url);
//定义block
__block ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
//设置请求超出时间
[request setTimeOutSeconds:60];
//设置请求方式
[request setRequestMethod:httpMethod];

//处理POST请求方式的参数
NSComparisonResult comparRet2=[httpMethod caseInsensitiveCompare:@"POST"];
if (comparRet2==NSOrderedSame) {
NSArray *allkeys=[params allKeys];
for (int i=0; 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
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

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

时间: 2024-12-25 13:33:15

移动开发在路上-- IOS移动开发系列 网络交互四(3)的相关文章

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

接着上次的讲,这次我们讲 网络请求的封装  打开创建的项目,让我们一起来继续完成他, 首先我们来创建一个NSobject 的文件 圈住出来的轻一点要注意.千万不要搞错了 创建好之后,开始编写代码, 我们第一不要要先把工程文件引用进来 看图 让后我们定义一下接口  和 一个block //block定义 typedef void(^RequestFinishBlock)(id result); 1 @interface ZWJDataService : NSObject 2 3 //定义接口 4

iOS企业级开发初级课程-表视图(13集)

首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜索栏.分组的使用.然后我们学习了如何对表视图单元格进行删除.插入.移动等操作.最后本章向大家介绍了表视图UI设计模式方面的内容. 序号 技术点 1 表视图-1-表视图介绍 2 表视图-2-简单表视图 3 表视图-3-简单表视图下 4 表视图-4-自定义单元格 5 表视图-5-搜索栏-1 6 表视图-

iOS开发系列--网络开发

iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 50097 阅读, 53 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession

iOS开发系列--IOS程序开发概览ios基础

iOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 72273 阅读, 81 评论, 收藏,  编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的知识是你日后开发IOS的基础,没有那些知识你开发IOS会很痛苦,现在很多开发人员做开发都是一知半解,程序质量确实令人担忧,所以还是希望大家能够熟练掌

iOS开发系列--网络开发网络联网程序

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

iOS开发-博客导出工具开发教程(附带源码)

前言: 作为一名学生, 作为一名iOS开发学习者, 我个人浏览信息包括博客, 更多的选择移动终端.然而, csdn并没有现成的客户端(不过有个web版的). 之前曾经看到一款开源的导出工具, 但是它是基于Windows平台的.导出的也仅仅是PDF格式.而且, 对于文章的导出, 需要精确URL.无法做到边浏览别导出. 另外, 我想实现的是, 可以在没有网络的情况下, 浏览自己收藏的文章.并且, 对于自己收藏的文章, 可以分类管理. 最关键的是, 对于自己的文章, 可以做一个备份.我曾经遇到过这样一

iOS/mac开发的一些知名个人博客

王巍的博客:王巍目前在日本横滨任职于LINE.工作内容主要进行Unity3D开发,8小时之外经常进行iOS/Mac开发.他的陈列柜中已有多款应用,其中番茄工作法工具非常棒.http://onevcat.com池 建强的博客: 池建强,70后程序员,Blogger.98年毕业,先后就职于洪恩软件.RocketSofeware和用友软件工程公司(后更名为瑞友 科技),现任瑞友科技IT应用研究院副院长.该博客最初每天发送一条Mac技巧,不过目前已经形成了一种技术和人文结合的风格,时而随笔,时而技术.h

关于ios越狱开发的那些事

也许吧,每每接触某些新东西的时候,都有点犯晕吧,这不是应该要的. 第一次接触ios越狱开发,也是这样吧.这篇主要是从无到有的说一下ios越狱的开发,网上很多的教程大部门都比较旧了吧,放在新设备上总是出现这样那样的问题,使人很是头疼. 从windows转到mac下开发,总有这个那个的不适应.习惯了vs的开发,突然用起了xcode难免有些为难,不是说xcode不好,两者都是非常好用的工具. 当然了,开发越狱程序和日常开发的iOS程序很相似,不过,越狱程序能做更强大的事情.你的设备也必须是要越狱的,你

iOS越狱开发(一)

做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进行越狱开发,涉及到以下几个方面: (1)主要涉及到越狱市场的建立,在App内部实现ipa的安装和卸载以及更新.参照的对象就是91助手,25pp,同步推那样的应用.建立一个盗版的App Store.当然了,如果通过299刀的企业证书的话,是不需要通过Cydia的,直接通过网页链接就可以实现app的推广,有一定的风险.这里面涉及