发送网络请求要使用异步的方式,不能使用同步的方式
并且异步的get请求有两种方式
第一种
使用 sendAsynchronousRequest 方法实现
//设置请求路径
NSString *urlStr = [NSString stringWithFormat:@"http://172.16.20.107:8080/TFServer/login?username=%@&pwd=%@", username, password];
//按照utf8编码 转成没有中文的字符串
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//url不能包含中文
NSURL *url = [NSURL URLWithString:urlStr];
//创建请求对象,默认就是get请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//创建一个队列,因为界面刷新的操作只能在主线程,所以这个队列一般就是主线程队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
//开始发送异步请求,其中data为服务器端返回的所有数据,代码块为请求结束所执行的事
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
[MBProgressHUD hideHUD];//隐藏正在登录的那个框框
if(data) {
//将返回的json数据解析为字典
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSString *error = dict[@"error"];
if(error) {
[MBProgressHUD showError:@"网络繁忙"];
} else {
[MBProgressHUD showSuccess:@"登录成功"];
}
}
}];
第二种
第二种方法是使用代理方法,这个也是异步请求,当请求开始其他线程就会执行代理方法
开始一个网络请求
//也是一个异步的
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//请求开始
[conn start];
四个常用的代理方法
//收到服务器端的回应()请求成功 第一执行
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {}
//服务器端返回数据就会调用这个方法,可能会调用多次,因为每次只返回一部分数据 第二执行
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {}
//接受玩数据会调用 最后执行
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {}
完整代码
//设置请求路径
NSString *urlStr = [NSString stringWithFormat:@"http://172.21.190.87:8080/TFServer/login?username=%@&pwd=%@", username, password];
//按照utf8编码 转成没有中文的字符串
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//url不能包含中文
NSURL *url = [NSURL URLWithString:urlStr];
//创建请求对象,默认就是get请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.timeoutInterval = 5;//设置请求超时时间
//直接就发出一个异步请求
[NSURLConnection connectionWithRequest:request delegate:self];
}
#pragma mark -实现代理方法
//请求错误或者失败的时候调用(断网)请求失败会执行这个
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"didFailWithError");
[MBProgressHUD showError:@"请求失败,请检查您的网络"];
}
//收到服务器端的回应()请求成功 第一执行
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"didReceiveResponse");
self.responseData = [NSMutableData data];
}
//服务器端返回数据就会调用这个方法,可能会调用多次,因为每次只返回一部分数据 第二执行
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"didReceiveData");
NSLog(@"%@", data);
[self.responseData appendData:data];
NSLog(@"%@", self.responseData);
}
//接受玩数据会调用 最后执行
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"connectionDidFinishLoading");
[MBProgressHUD hideHUD];
NSLog(@"%@", self.responseData);
//将返回的json数据解析为字典
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableContainers error:nil];
NSString *error = dict[@"error"];
if(error) {
[MBProgressHUD showError:@"网络繁忙"];
} else {
[MBProgressHUD showSuccess:@"登录成功"];
}
}