网络请求
1.发送请求
url: = 网络协议(http://今后可能是https) +文件路径? + 参数1&参数2.....
2.接收响应
3.创建连接对象传输数据
Xcode7之后若想要使用http,需要修改info.plist文件
NSAppTransportSecurity NSDictionary
NSAllowsArbitraryLoads BOOL YES
如有不明白的地方,网上有详细图文教程,在此不过多说明
下面来详细介绍网络请求方式:
同步GET
同步POST
异步GET
异步POST
Session请求
同步POST
//创建url对象
NSURL *url =[NSURL URLWithString:URL_PORT1];
//创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//创建请求方式
[request setHTTPMethod:@"post"];
//设置请求参数
NSData *tempData = [URL_PORT2 dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:tempData];
//创建响应对象
NSURLResponse *response = nil;
//创建连接对象
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (data != nil) {
//解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
for (NSDictionary *dict in dic[@"news"]) {
News *news = [News new];
[news setValuesForKeysWithDictionary:dict];
[_dataArray addObject:news];
}
for (News *news in _dataArray) {
NSLog(@"%@",news);
}
}
同步GET
//创建url对象
NSURL *url = [NSURL URLWithString:BASE_URL];
//创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//2.1创建请求方式(默认是get,这一步可以不写)
[request setHTTPMethod:@"get"];
//创建响应对象(有时会出错)
NSURLResponse *response = nil;
//创建连接对象
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
//解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
self.dataArray = [NSMutableArray arrayWithCapacity:5];
for (NSDictionary *dict in dic[@"news"]) {
News *news = [News new];
[news setValuesForKeysWithDictionary:dict];
[_dataArray addObject:news];
}
// for (News *news in _dataArray) {
// NSLog(@"%@",news);
// }
异步GET
//创建url对象
NSURL *url = [NSURL URLWithString:BASE_URL];
//创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//创建连接对象,实现代理
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
//开始执行
[connection start];
异步POST
NSURL *url = [NSURL URLWithString:URL_PORT1];
//创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"post"];
NSData *data = [URL_PORT2 dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//连接
NSURLConnection *connection =[NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
一般的,当创建异步连接时, 很少用到第一种方式,经常使用的是代理方法。关于NSURLConnectionDataDelegate,我们经常使用的协议方法为一下几个:
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"文件连接出现了error = %@",error);
}
//接收响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
self.tempData = [NSMutableData data];
}
//接收数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[_tempData appendData:data];
}
//加载完毕
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_tempData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
Session请求
NSURL *url = [NSURL URLWithString:BASE_URL];
//创建session对象
NSURLSession *session = [NSURLSession sharedSession];
//创建task(该方法内部做了处理,默认使用get)
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
NSLog(@"%d",[[NSThread mainThread]isMainThread]);
}];
//启动回话
[task resume];
总结:
GET请求和POST请求的区别:
GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过 ? 来间隔。POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器。
GET请求参数会出现在接口中,不安全。而POST请求相对安全。
3.虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,POST多用于向后台提交数据。
同步和异步的区别:
同步链接:主线程去请求数据,当数据请求完毕之前,其他线程一律不响应,会造成程序就假死现象。
异步链接:会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅。