【学习总结】网络

什么是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];

 

posted @ 2015-10-21 20:43  Travin-C  阅读(195)  评论(0编辑  收藏  举报