/**
* 创建NSData类型对象, 用来接收异步请求回得数据
*/
@property(nonatomic, retain) NSMutableData *asyData;
@end
@implementation ViewController
/*
gat和post的区别:
1.请求方式 参数部分: get采用字符串直接拼接的方法, post使用NSData类型数据拼接. 对安全性产生了影响. NSData类型使用二进制数, 不直接看到值. 相当于密文方式.
2.容量大小 get请求最多允许255字节的字符串, post的采用NSData最大可超过1G.
3.使用get更多, 因为简单.
同步请求弊端: 等所有信息全部返回之后才能显示下一步操作. 容易出现卡死现象. 大量数据时不能用.
*/
/*
同步请求的特点: 一旦发送请求, 当前程序一直等待获得全部响应信息, 才可以进行下一步操作. (页面假死现象)
*/
- (IBAction)getSyn:(id)sender {
NSLog(@"开始get同步方法");
//第一步: 获取地址
NSString *urlStr = @"http://p1.pichost.me/i/40/1639665.png";
//第二步: 创建url对象
NSURL *url = [NSURL URLWithString:urlStr];
//第三步: 创建网络请求对象 (NSURlRequest)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//第四步: 创建响应对象 (NSURLResponse)
NSURLResponse *response = nil;
//错误信息 可有可无
//如果网络有错误, 可以用来接收错误信息
NSError *error = nil;
//第五步: 创建网络链接, 并且获得返回的NSData
/**
* 参数说明: 1.请求对象; 2.用来接收响应的对象 (两个** 取址) 3.错误信息
*/
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
//如果请求错误, 打印错误信息
if (error) {
NSLog(@"%@", error);
}else{
//进行数据解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", dic);
}
}
- (IBAction)postSyn:(id)sender {
NSLog(@"开始post同步方法");
//第一步: 获得地址
NSString *string = @"http://mapi.pianke.me/pub/jing";
//第二步: 创建url对象
NSURL *url = [NSURL URLWithString:string];
//第三步: 创建请求对象 (需要设置请求方式, 并且拼接参数, 所以需要使用可变的请求对象)
//参数不是都写在网址中的
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//第四步:设置请求方式(默认是GET, 注意: POST全大写)
//默认为get请求方式
[request setHTTPMethod:@"POST"];
//第五步: 拼接POST请求参数部分
// (1). 获得参数字符串
//参数部分
NSString *bodyStr = @"auth=CJFm1FH259KJDCsF1Gs3ikDJxQMejNrOMom1lsDzRlcWP22NJPSh5a7m34&client=1&did=DC7311B8-4DFE-4BC2-99D9-565BF1215670&version=3.0.6";
// (2). 将参数字符串转化成NSData类型对象
// 方法: dataUsingEncoding 指定编码格式
NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
//第六步: 设置请求参数
[request setHTTPBody:bodyData];
//第七步: 设置响应对象和错误信息
NSURLResponse *response = nil;
NSError *errol = nil;
//第七步: 建立网络链接, 获得响应数据
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&errol];
//最后一步: 进行数据解析
if (errol) {
NSLog(@"%@", errol);
}else{
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", dic);
}
}
- (IBAction)gatAsy:(id)sender {
NSLog(@"开始get的异步请求方法");
//1, 2 创建URL对象
NSURL *url = [NSURL URLWithString:@"http://p1.pichost.me/i/40/1639665.png"];
//3. 创建网络请求对象 (NSURLRequest)
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//4.创建网络链接对象 (NSURLConnection)
//参数说明: 1.请求对象 2.代理人
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
//5.建立连接
[connection start];
}
#pragma mark 获得响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"获得服务器响应");
//数据源, 最晚需要在获得响应时创建
self.asyData = [[NSMutableData alloc]init];
}
#pragma mark 获得响应数据 (这个方法会多次执行, 每次获得部分响应信息)
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"获得响应数据");
//每次调用这个方法, 返回一些data
//Data不一起给, 这个方法会执行多次, 每次拼接到上次的Data后, Data必须为NSMutableData
[self.asyData appendData:data];
}
#pragma mark 接收响应信息结束
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//进行数据解析
NSLog(@"完成数据加载, 结束接收响应");
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.asyData options:0 error:nil];
NSLog(@"%@", dic);
}
#pragma mark POST异步请求 (Block实现)
- (IBAction)postAsy:(id)sender {
NSLog(@"Post异步方法");
//第一步: 获得地址
NSString *string = @"http://mapi.pianke.me/pub/jing";
//第二步: 获得URL对象
NSURL *url = [NSURL URLWithString:string];
//第三步: 创建网络请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//第四步: 请求方式
[request setHTTPMethod:@"POST"];
//获得请求参数
//(1). 获得参数字符串
NSString *bodyStr = @"auth=CJFm1FH259KJDCsF1Gs3ikDJxQMejNrOMom1lsDzRlcWP22NJPSh5a7m34&client=1&did=DC7311B8-4DFE-4BC2-99D9-565BF1215670&version=3.0.6";
//(2). 将参数字符串转化成NSData对象
NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
//第六步: 设置请求参数
[request setHTTPBody:bodyData];
//第七步: 开始异步请求
/**
* 参数说明
*
1.请求对象
2.主线程
3.Block
* @param response 响应对象
* @param data 响应数据
* @param connectionError 错误信息
*
* @return
*/
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//Block内部获得的Data是完整的
if (connectionError) {
NSLog(@"%@", connectionError);
}else{
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", dic);
}
}];
}
#pragma mark 改变背景颜色
- (IBAction)changeBackgroundColor:(id)sender{
self.view.backgroundColor = [UIColor orangeColor];
}