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

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>
运行结果如下:







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值