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>
编辑控制器的.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>
运行结果如下: