Get & Post请求
•网络访问的四个步骤
sendSynchronousRequest:request returningResponse:&response error:&error
sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
有关主操作队列的内容,在多线程课程讲解
同步请求数据会造成主线程阻塞,通常在请求大数据或网络不畅时不建议使用。
从上面的代码可以看出,不管同步请求还是异步请求,建立通信的步骤基本是一样的:
1、创建NSURL
2、创建Request对象
3、创建NSURLConnection连接。
NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。
(今天学习关于网络的基础,代码有一些重复,缓存策略还没有学习)
下面是get和post方式的代码:
#pragma mark - 测试get方式 -(IBAction)getLogin:(UIButton *)btn { static NSString * loginUrl =@"http://192.168.1.102:8080/IOSApplication/LoginServletController.do"; //初始化数据 _receiveDate = [NSMutableData data]; //定义URL NSString * urlStr = [NSString stringWithFormat:@"%@?username=%@&password=%@",loginUrl,_userName.text,_password.text]; // 注意:网络请求的URL,需要编码才可以使用!!!_ NSURL *url = [NSURL URLWithString:urlStr]; //// 定义请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //定义连接 NSURLConnection *cont = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [cont start]; } #pragma mark - 网络连接错误判断 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"网络连接错误%@",error.localizedDescription); } #pragma mark - 接收响应 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"开始接收的响应"); } #pragma mark - 收到数据 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"收到服务器返回的数据:%@",data); [_receiveDate appendData:data]; } #pragma mark - 连接结束 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *backString = [[NSString alloc]initWithData:_receiveDate encoding:NSUTF8StringEncoding]; NSLog(@"结束接收的数据 %@",backString); _receiveDate = nil; } #pragma mark - 测试post方式 -(IBAction)postLogin:(UIButton *)btn { static NSString * loginUrl =@"http://192.168.1.102:8080/IOSApplication/LoginServletController.do"; //初始化数据 _receiveDate = [NSMutableData data]; // 定义URL,字母及数字组成的url不需要编码 NSURL * url = [NSURL URLWithString:loginUrl]; //定义请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //等待服务器响应时间5 [request setTimeoutInterval:5.0]; //设置请求方式 [request setHTTPMethod:@"post"]; NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userName.text,_password.text]; //生成请求数据并编码 NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; // 设置HTTP请求数据体,NSMutableURLRequest会自动在请求头中加入Content-Length [request setHTTPBody:body]; //设置连接 NSURLConnection *cont = [[NSURLConnection alloc]initWithRequest:request delegate:self]; //开始连接 [cont start]; } #pragma mark - 发送数据给服务器,POST请求使用此方法 - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { NSLog(@"发送数据给服务器 bytesWritten: %ld, totalBytesWritten %ld totalBytesExpectedToWrite %ld", bytesWritten,totalBytesWritten,totalBytesExpectedToWrite); }
下面是同步和异步(NSURLConnection提供了两个静态方法可以直接同步或异步调用NSURLRequest,而无需通过NSURLConnectionDataDelegate获取数据)
//生成post请求 -(NSMutableURLRequest *)postLoginRequest { static NSString * loginUrl =@"http://192.168.1.102:8080/IOSApplication/LoginServletController.do"; //初始化数据 _receiveDate = [NSMutableData data]; // 定义URL,字母及数字组成的url不需要编码 NSURL * url = [NSURL URLWithString:loginUrl]; //定义请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //等待服务器响应时间5 [request setTimeoutInterval:5.0]; //设置请求方式 [request setHTTPMethod:@"post"]; NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userName.text,_password.text]; //生成请求数据并编码 NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; // 设置HTTP请求数据体,NSMutableURLRequest会自动在请求头中加入Content-Length [request setHTTPBody:body]; return request; } #pragma mark - post 同步方式登录 -(IBAction) synchronizationLogin:(UIButton *)btn { NSMutableURLRequest *request = [self postLoginRequest]; NSError *error; NSURLResponse *response; NSDate * date = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // 注意,只有同步请求结束之后,才会执行后续操作,修改LOGIN_URL可以看到效果 if (!date) { NSLog(@"同步访问错误:%@",error.localizedDescription); } else{ //解码数据 NSString *string = [[NSString alloc]initWithData:date encoding:NSUTF8StringEncoding]; NSLog(@"同步数据 %@",string); } } #pragma mark - post 异步方式登录 -(IBAction)asynchronizationLogin:(UIButton *)btn { NSMutableURLRequest *request = [self postLoginRequest]; // 注意此处使用了块代码!异步请求队列使用的是操作队列的主队列 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if([data length]>0 && connectionError==nil) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"异步成功返回的数据%@",string); } else if ([data length] <=0 && connectionError==nil) { NSLog(@"没有接收到返回数据"); } else { NSLog(@"异步访问错误%@",connectionError.localizedDescription); } }]; }
原文:http://www.cnblogs.com/wangpfcnblogs/p/4666019.html