简介
-
NSURLConnection:
作用: 1、负责发送请求,建立客户端和服务器的连接发送数据给服务器 2、并收集来自服务器的响应数据 步骤: 1、创建一个NSURL对象,设置请求路径 2、传入NSURL并创建一个NSURLRequest对象,设置请求头和请求体 3、使用NSURLConnection发送请求
-
常见类
1、NSURL:收纳请求的地址 2、NSURLRequest:一个NSURLRequest对象就代表一个请求,它包含的信息有一个NSURL对象、请求方法、请求头、请求体等等 3、NSMutableURLRequest是NSURLRequest的子类
-
发送请求
- 同步请求
-(void)sendSynchronousRequest{ //1、创建一个URL //协议头+主机地址+接口名称+?+参数1&参数2&参数3 //这里的话是我自己使用.Net开发的一个本地后台接口 http://192.168.1.0:8080/login?username=LitterL&pwd=123 NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"]; //2、创建请求(Request)对象(默认为GET请求); NSURLRequest *requst = [[NSURLRequest alloc]initWithURL:url]; //3、发送请求 /* 第一个参数:请求对象 第二个参数:响应头 第三个参数:错误信息 返回值:NSData类型,响应体信息 */ NSError *error = nil; NSURLResponse *response = nil; //发送同步请求(sendSynchronousRequest) NSData *data = [NSURLConnection sendSynchronousRequest:requst returningResponse:&response error:&error]; //如果没有错误就执行 if (!error) { //打印的服务端返回的信息以及错误信息 NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); NSLog(@"%@",error); }
}
```
补充:
```objc
1、上面的话默认为GET请求,可以看到协议头+主机地址+接口名称+?+参数1&参数2,这里的话教大家一个技巧,如果看到接口后面是带问号(?)那么就证明它为GET请求,至于POST请求的话在异步请求里面会告诉大家
2、这里的话默认是在主队列执行的,为同步请求,一般不建议大家使用这个,开发人员一般使用的方式是异步执行的,也就是下面这种方式,因为它是在后台线程执行。
```
-
异步请求
补充:-(void)sendAsynchronousRequest{ //1、创建一个URL NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login"]; //2、创建请求(Request)对象 这里使用的是它的子类NSMutableURLRequest,因为子类才具有设置方法和设置请求体的属性 NSMutableURLRequest *requst = [[NSMutableURLRequest alloc]initWithURL:url]; //2.1、设置请求方法 requst.HTTPMethod = @"POST"; //2.2、设置请求体,因为传入的为Data数据所有这里需要转换 requst.HTTPBody = [@"username=LitterL&pwd=123" dataUsingEncoding:NSUTF8StringEncoding]; //2.3、设置请求超时时间,如果超过这个时间,请求为失败 requst.timeoutInterval = 10; //3、发送请求 /* 第一个参数:请求对象 第二个参数:队列 第三个参数:Block回调函数 response:响应头 data:响应体信息 connectionError:错误信息 */ //发送异步请求(sendAsynchronousRequest) [NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSLog(@"----%@",[NSThread currentThread]); //解析数据 NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); }]; }
1、在这里的话是我们是使用了POST请求,然而使用POST请求那么就必须的使用NSURLRequest的子类NSMutableURLRequest. 2、只有在它的里面才具有设置请求方法和方法体的属性
-
代理请求
- 简述
//如果你使用的是代理请求的话,那么你需要知道四个方法: 1、当接受到服务器响应的时候会调用:response(响应头) -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 2、当接受到服务器返回数据的时候调用(会调用多次) - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 3、当请求失败的时候调用 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 4、当请求结束(成功|失败)的时候调用 - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
- 代码
1、首先实现代理,并定义一个NSData对象初始化,在请求结束的时候查看服务器传来的内容, @interface ViewController ()<NSURLConnectionDataDelegate> /** 可变的二进制数据 */ @property (nonatomic, strong) NSMutableData *fileData; @end /* 懒加载 */ -(NSMutableData *)fileData{ if (!_fileData) { _fileData = [[NSMutableData alloc]init]; } return _fileData; } 2、实现代理中的四个方法 //1.当接受到服务器响应的时候会调用:response(响应头) -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"接受到相应"); } //2.当接受到服务器返回数据的时候调用(会调用多次) -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // NSLog(@"接受到数据"); //拼接数据 [self.fileData appendData:data]; } //3.当请求失败的时候调用 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"请求失败"); } //4.当请求结束(成功|失败)的时候调用 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"请求结束"); //解析数据 NSLog(@"%@",[[NSString alloc]initWithData:self.fileData encoding:NSUTF8StringEncoding]); } 3、最后编写点击时调用的方法 -(void)sendRequestWithDelegate{ //1.确定请求路径 NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"]; //2.创建请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3、代理请求 /* 第一个参数:请求对象 第二个参数:谁成为代理 第三个参数:startImmediately :是否立即开始发送网络请求 */ NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO]; //[connect cancel]; 取消 [connect start]; }
结束
本章到此结束
欢迎各位码友随意转载并指正