【学习总结】网络
什么是HTTP通讯过程?
1. 请求 (客户端发送请求信息到服务器的过程)
-> 请求行 : 请求方法 , 请求路径 , HTTP协议的版本
*GET , /Server/resources/vidios/1.mp4 , HTTP/1.1
-> 请求头 : 客户端的一些描述信息
User - Agent : 客户端的环境 (软件环境)
-> 请求体 : POST方式的请求,才有这个
* 请求参数, 将所有参数包装好,发送给服务器
2. 响应(服务器接收到请求之后, 会返回一些东西给客户端,这个过程叫服务器的响应)
-> 状态行(响应行) : HTTP协议的版本, 响应状态码 , 响应状态描述
HTTP/ 1.1 200 OK
-> 响应头 : 服务器的描述信息
* Content-Type : 服务器返回给客户端的内容类型
* Content-Length 服务器返回给客户端的内容的长度 (比如文件的大小)
-> 实体内容(响应体) :
* 服务器返回给客户端具体的数据, 比如文件数据
怎样发送HTTP请求的方法?
1. GET
-> 特点 : 所有的请求参数都要拼接在URL后面
-> 缺点 :
* 在URL中暴露了所有的请求数据, 不太安全
* URL的长度有限制, 不能发送太多的参数
->使用场合 : 一般用作访问服务器资源,索要数据,没数据交互一般用GET请求
2. POST
-> 特点 : 把所有请求参数放大请求体(HTTPBody)中,并且参数大小没有限制
-> 缺点 : 如果单纯索要数据,不需要做数据交互操作,即显过于复杂.
-> 使用场合 :
* 除了向服务器索要数据以外的请求, 都可以用POST请求.
* 如果发给服务器的数据是一些隐私,敏感的数据,绝对要用POST请求.
发送HTTP请求需要注意什么?
1.URL转码
-> url不能包含中文, 所以拼接的中文一定要转码
NSString *urlStr = [NSString stringWithFormat:@"http://localhost:8080/login?username=%@&pwd=%@",usernameText, pwdText];
// 将中文转码.
[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
2.设置超时
NSURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 为请求设置超时时间很重要,影响用户体验
request.timeoutInterval = 8;
什么是JSON? 什么是XML?
怎样解释服务器返回的JSON数据和XML数据?
大文件下载的思路?
1. 方案 : 利用NSURLConnection和它的代理方法
-> 发送一个请求
// 1.创建下载地址URL NSURL *url = [NSURL URLWithString:@"这里写上下载地址"]; // 2.创建Request请求,并且将URL包装成请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.利用NSURLConnection发送请求, 完成下载(创建完conn对象后,会自动发起一个异步请求) [NSURLConnection connectionWithRequest:request delegate:self];
->服务器的响应,会在NSURLConnection的代理方法中实现, 所以代理方法中会处理这些返回的数据
1 #pragma mark - NSURLConnectionDataDelegate代理方法 2 // 一开始下载就会调用下面的代理方法 3 4 /** 5 * 请求失败时调用(请求超时、网络异常) 6 * 7 * @param error 错误原因 8 */ 9 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 10 { 11 NSLog(@"这里写上请求超时的时候的操作"); 12 } 13 14 /** 15 * 1.接收到服务器的响应就会调用 16 * 17 * @param response 响应 18 */ 19 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 20 { 21 // 文件路径 22 // 拿到沙盒的Cachs文件夹 , 一般传入沙盒的Cache文件中 23 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 24 25 NSString *filepath = [caches stringByAppendingPathComponent:@"文件名"]; 26 27 // 创建一个空的文件 到 沙盒中 28 // NSFileManager 文件管理者 29 NSFileManager *mgr = [NSFileManager defaultManager]; // 这个是一个单例 30 31 // 根据路径创建一个文件 32 [mgr createFileAtPath:filepath contents:nil attributes:nil]; 33 34 // 创建一个用来写数据的文件句柄 35 self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; 36 37 } 38 39 /** 40 * 2.当接收到服务器返回的实体数据时调用(具体内容,这个方法可能会被调用多次) 41 * 42 * @param data 这次返回的数据 43 */ 44 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 45 { 46 // 移动到文件的最后面 47 [self.writeHandle seekToEndOfFile]; 48 49 // 将数据写入沙盒 50 [self.writeHandle writeData:data]; 51 52 } 53 54 /** 55 * 3.加载完毕后调用(服务器的数据已经完全返回后) 56 */ 57 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 58 { 59 60 // 关闭文件 , 用完要关闭, 如果不关闭,管道会长期存在 61 [self.writeHandle closeFile]; 62 // 并且需要清空,防止内存泄露 63 self.writeHandle = nil; 64 }
思路就是 : 创建请求 -> 发送请求 -> 代用代理方法接收服务器响应 -> 然后在接收到服务器的响应时创建一个空文件
-> 然后在接收到实体数据时会调用didReceiveData方法(方法会调用很多次) -> 方法内部,不断移动句柄与写入数据
-> 数据接收完毕后,关闭句柄管道,清空句柄对象.
2. 一些注意点
不能用NSMytableData来拼接服务器返回的数据. 因为NSMytableData会将数据存储到内存,内存会瞬时增大.
NSURLConnection发送异步请求有哪些方法?
1. block
1 [NSURLConnection sendAsynchronousRequest:<#(NSURLRequest *)#> queue:<#(NSOperationQueue *)#> completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 2 // 数据接收完才执行这里的代码块 3 }]
2.代理形式
这种也是异步请求的形式, 调用NSURLConnection connectionWithRequest方法, 传入请求就会自动发送异步请求
不过这种方式需要设置代理接收,服务器返回的信息.适合用于大文件下载
1 // 1.URL 2 NSURL *url = [NSURL URLWithString:@"下载地址"]; 3 4 // 2.请求 5 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 6 7 // 3.下载(创建完conn对象后,会自动发起一个异步请求) 8 [NSURLConnection connectionWithRequest:request delegate:self];