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