1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,
2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行
3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;
4、POST请求,将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。
一、同步下载
//第一步:创建URL
NSURL *pURL = [NSURL URLWithString:URL];
//第二步:创建一个请求
NSURLRequest *pRequest = [NSURLRequest requestWithURL:pURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//第三步:建立连接
NSError *pError = nil;
NSURLResponse *pRespond = nil;
//向服务器发起请求(发起之后,线程就会一直等待服务器响应,直到超出最大响应时间)
NSData *pData = [NSURLConnection sendSynchronousRequest:pRequest returningResponse:&pRespond error:&pError];
//输出获取结果
NSLog(@"pData = %@",pData);
//输出错误信息
NSLog(@"pError = %@",[pError localizedDescription]);
二、异步下载
/*异步请求*/
//1.获取网络资源路径(URL)
NSURL *pURL1 = [NSURL URLWithString:URL];
//2.根据URL创建请求
NSURLRequest *pRequset1 = [NSURLRequest requestWithURL:pURL1 cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//3.(与同步请求的区别点)发起请求,通过委托模式回调完成数据获取
[NSURLConnection connectionWithRequest:pRequset1 delegate:self];
/*注意:在异步请求中使用了NSURLConnectionDataDelegate协议,委托对象为自己。其中有四个经常用到的方法,我们将获得的数据放在self.pData中,其类型为
NSMutableData 。*/
//1.服务器响应回调的方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"服务器响应");
self.pData = [NSMutableData dataWithCapacity:5000];
}
//2.服务返回数据,客户端开始接受(data为返回的数据)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"服务器返回数据");
//将返回数据放入缓存区
[self.pData appendData:data];
}
//3.数据接受完毕回调的方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"数据接受完毕");
NSLog(@"pData = %@",self.pData);
}
//4.接受数据失败时候调用的方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"数据接受失败,失败原因:%@",[error localizedDescription]);
}
三、JSON
简单 JSON 示例 按照最简单的形式,可以用下面这样的 JSON 表示名称 / 值对:
简单 JSON 示例 按照最简单的形式,可以用下面这样的 JSON 表示名称 / 值对:
{ "firstName": "Brett" } 等效于 : firstName=Brett。
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }
JSON 值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组(在方括号中)、对象(在花括号中)、null。
NSString *jsonStr = @"{\"name\":\"Zhangsan\",\"age\":20,\"dog\":{\"name\":[\"XiaoHei\", \"XiaoQiang\"]}}";
NSData *data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
//将Json数据转化为OC的对象
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", dict);
NSLog(@"%@", dict[@"dog"][@"name"]);
NSDictionary *dogDict = [dict objectForKey:@"dog"]
;
NSArray *array = [dogDict objectForKey:@"name"];
NSLog(@"%@", array);
NSString *name = [array objectAtIndex:0];
NSLog(@"%@", name);
NSNumber *num = [dict objectForKey:@"age"];
NSLog(@"%@", num);
//字典、数组、数值、字符串
NSArray *arr = @[@123, @"123", @{@"name": @"Lisi", @"age": @30}];
//将OC的对象转化为Json数据
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil];
NSString *str = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);
[str writeToFile:@"/Users/apple/Desktop/test.json" atomically:YES encoding:NSUTF8StringEncoding error:nil];