【学习总结】网络
2015-10-21 20:43
483 查看
什么是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的代理方法中实现, 所以代理方法中会处理这些返回的数据
#pragma mark - NSURLConnectionDataDelegate代理方法 // 一开始下载就会调用下面的代理方法 /** * 请求失败时调用(请求超时、网络异常) * * @param error 错误原因 */ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"这里写上请求超时的时候的操作"); } /** * 1.接收到服务器的响应就会调用 * * @param response 响应 */ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // 文件路径 // 拿到沙盒的Cachs文件夹 , 一般传入沙盒的Cache文件中 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *filepath = [caches stringByAppendingPathComponent:@"文件名"]; // 创建一个空的文件 到 沙盒中 // NSFileManager 文件管理者 NSFileManager *mgr = [NSFileManager defaultManager]; // 这个是一个单例 // 根据路径创建一个文件 [mgr createFileAtPath:filepath contents:nil attributes:nil]; // 创建一个用来写数据的文件句柄 self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; } /** * 2.当接收到服务器返回的实体数据时调用(具体内容,这个方法可能会被调用多次) * * @param data 这次返回的数据 */ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // 移动到文件的最后面 [self.writeHandle seekToEndOfFile]; // 将数据写入沙盒 [self.writeHandle writeData:data]; } /** * 3.加载完毕后调用(服务器的数据已经完全返回后) */ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { // 关闭文件 , 用完要关闭, 如果不关闭,管道会长期存在 [self.writeHandle closeFile]; // 并且需要清空,防止内存泄露 self.writeHandle = nil; }
思路就是 : 创建请求 -> 发送请求 -> 代用代理方法接收服务器响应 -> 然后在接收到服务器的响应时创建一个空文件
-> 然后在接收到实体数据时会调用didReceiveData方法(方法会调用很多次) -> 方法内部,不断移动句柄与写入数据
-> 数据接收完毕后,关闭句柄管道,清空句柄对象.
2. 一些注意点
不能用NSMytableData来拼接服务器返回的数据. 因为NSMytableData会将数据存储到内存,内存会瞬时增大.
NSURLConnection发送异步请求有哪些方法?
1. block[NSURLConnection sendAsynchronousRequest:<#(NSURLRequest *)#> queue:<#(NSOperationQueue *)#> completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 数据接收完才执行这里的代码块 }]
2.代理形式
这种也是异步请求的形式, 调用NSURLConnection connectionWithRequest方法, 传入请求就会自动发送异步请求
不过这种方式需要设置代理接收,服务器返回的信息.适合用于大文件下载
// 1.URL NSURL *url = [NSURL URLWithString:@"下载地址"]; // 2.请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.下载(创建完conn对象后,会自动发起一个异步请求) [NSURLConnection connectionWithRequest:request delegate:self];
相关文章推荐
- WEB服务器 - Apache、Nnginx、Lighttpd的比较和择优(转)
- linux0.99网络模块-应用层 or 传输层读写
- When the CRC and TCP checksum disagree
- 2015 ACM-ICPC国际大学生程序设计竞赛北京赛区网络赛 1002 Mission Impossible 6
- 铁蹄踏遍“网络流”!
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
- TCP缓冲区大小及限制
- TCP的建立和终止
- HttpClient及有关jar包详解
- https连接过程
- HTTP的Get/Post请求区别
- 初识网络进程通信<Heart.X.Raid>
- IOS网络笔记--AFNworking练习之文件下载
- 网络编程 笔记(六) 多进程服务器
- httpClient发送post请求
- Apache服务器配置https协议/SSL证书的方法
- No mapping found for HTTP request with URI
- C#通过WebClient/HttpWebRequest实现http的post/get方法
- cordova iOS项目在xcode7下访问网络请求异常
- 【手记】未能从程序集System.Net.Http.Formatting中加载类型System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter