您的位置:首页 > 理论基础 > 计算机网络

利用ASIHttpRequest框架进行网络数据请求(一)—— 利用get请求数据

2015-09-19 15:33 441 查看
get与post请求介绍:

HTTP中get请求与post请求

GET和POST区别详解

1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。

2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。

3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。

4、Get传输的数据量小(最多只能是1024个字节),这主要是因为受URL长度限制;而Post可以传输大量的数据(没有限制),所以在上传文件只能使用Post。

get请求数据 步骤如下:

第一步:将ASIHttpRequest框架包拉进工程 因为ASIHttpRequest是在非ARC环境下写的 所以需要进行配置具体如下:

1.1 如下图 切记 最后双击选中的ASIHttpRequest的.m文件 添加-fno-objc-arc编译标志



1.2 添加libz静态库 具体如下图



第二步:新建pch文件 把所有用的框架的头文件导入 如下所示:

<span style="font-size:18px;">//
//  PrefixHeader.pch
//  ASHttp
//
//  Created by apple on 15/9/19.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#ifndef ASHttp_PrefixHeader_pch
#define ASHttp_PrefixHeader_pch

#import "ASIHTTPRequest.h"
#import "SBJson.h"
#import "ChangeDictArrToModelArr.h"
#import "Model.h"
#import <objc/runtime.h>

#endif
</span>
注意:pch文件也需要配置:具体如下:



第三步:让控制器遵守ASIHTTPRequestDelegate 协议 ,让当前控制器作为代理属性,并实现协议中的方法即可:

第四步:根据返回的json字符串新建model模型 新建将字典或包含字典的json数组转换为存放模型model的数组中

具体代码如下:

新建Model类

编辑Model.h如下:

<span style="font-size:18px;">//
//  Model.h
//  ASHttp
//
//  Created by apple on 15/9/19.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Model : NSObject
@property(nonatomic, assign) int Id;
@property (nonatomic, strong) NSString *Title;
@property (nonatomic, strong) NSString *Body;
@property (nonatomic, strong ) NSString *AddTime;

-(instancetype) initWithDict:(NSDictionary *) dict;
-(void) print;
@end
</span>
编辑Model.m如下:

<span style="font-size:18px;">//
//  Model.m
//  ASHttp
//
//  Created by apple on 15/9/19.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import "Model.h"

@implementation Model

-(instancetype) initWithDict:(NSDictionary *) dict
{
if (self = [super init]) {
[self   setValuesForKeysWithDictionary:dict];
}
return self;
}

-(void) print
{
NSLog(@"%d   %@  %@  %@ ",_Id, _Title, _Body, _AddTime);
}

@end

</span>
新建将字典数组转化为model模型数组的类如下:

编辑ChangeDictArrToModelArr.h如下:

<span style="font-size:18px;">//
//  ChangeDictArrToModelArr.h
//  ASHttp
//
//  Created by apple on 15/9/19.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface ChangeDictArrToModelArr : NSObject

+(NSMutableArray *)change:(NSString *) modelNam  fromArray:(NSArray *)jsonArray;
@end
</span>
编辑编辑ChangeDictArrToModelArr.m如下:

<span style="font-size:18px;">//
//  ChangeDictArrToModelArr.m
//  ASHttp
//
//  Created by apple on 15/9/19.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import "ChangeDictArrToModelArr.h"

@implementation ChangeDictArrToModelArr

+(NSMutableArray *)change:(NSString *) modelNam  fromArray:(NSArray *)jsonArray
{
// 方式一: 利用反射机制解决
// 用来存放类中的变量个数
unsigned int outCount = 0;
objc_property_t *properties = class_copyPropertyList(NSClassFromString(modelNam), &outCount);
// 创建一个用来存放model可变数组
NSMutableArray *objArr = [NSMutableArray array];
for (int i=0; i<jsonArray.count; i++)
{
id  jsonDic = [jsonArray objectAtIndex:i];
if (![jsonDic isKindOfClass:[NSDictionary class]]) {
continue;
}
id model = [[NSClassFromString(modelNam) alloc] init];
// 遍历所有字典属性给model对应变量赋值
for (int j=0 ; j<outCount; j++)
{
objc_property_t  property = properties[j]; // 获取model类中第j个成员信息

// 获取第j个成员变量的名称并将其转化为字符串
NSString *propertyName = [NSString stringWithCString:property_getName(property)];

// 获取json串中的键对应的值
id value = [jsonDic objectForKey:propertyName];

// 判断上面取的值是否存在  不存在就转换为下一个
if (!value||[value isKindOfClass:[NSNull class]]) {
continue;
}
[model setValue:value forKey:propertyName];
}

// 把赋值后的model存入可变数组
[objArr addObject:model];
}

// 方式二: 利用KVC方法
//    NSMutableArray *objArr = [NSMutableArray array];
//    for (int i=0 ; i<jsonArray.count; i++) {
//        id jsonDic = [jsonArray  objectAtIndex:i];  // 取出每一个字典
//        if (![jsonDic isKindOfClass:[NSDictionary class]]) {
//            continue;
//        }
//        //  根据类名创建对象
//        id model = [[NSClassFromString(modelNam) alloc] initWithDict:jsonDic];
//        [objArr addObject:model];
//    }
return objArr;
}

@end
</span>


编辑控制器的.h如下:

<span style="font-size:18px;">//
//  ViewController.h
//  ASHttp
//
//  Created by apple on 15/9/19.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "ASIHTTPRequest.h"
#import "ASIHTTPRequestDelegate.h"

@interface ViewController : UIViewController<ASIHTTPRequestDelegate>

@end
</span>


编辑控制器的.m如下:

<span style="font-size:18px;">//
//  ViewController.m
//  ASHttp
//
//  Created by apple on 15/9/19.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end
// domain域名
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self  getRequest];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

-(void)getRequest
{
NSString *urlStr = @"http://www.ddpro.com.cn/api/show/news?page=1&pageSize=9";

// 具体步骤如下:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:urlStr]];
request.delegate = self;
[request setRequestMethod:@"GET"];
[request startAsynchronous];  // 开始异步获取请求  synchronized同步   synchronous 同步的 Asynchronous 异步的

}

- (void)requestFinished:(ASIHTTPRequest *)request
{
NSString *content = request.responseString;
NSLog(@"%@\n",content);
NSDictionary *total = [content JSONValue];
NSArray *list = [total objectForKey:@"list"];
NSMutableArray *models = [ChangeDictArrToModelArr change:@"Model" fromArray:list];
for (Model *model in  models){
[model print];
}
}
- (void)requestFailed:(ASIHTTPRequest *)request
{

}

@end
</span>
运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: