iOS开发-HTTP协议
HTTP协议,即超文本传输协议(Hypertext transfer protocol)。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
HTTP协议的主要特点可概括如下:
1、支持客户/服务器模式。支持基本认证和安全认证。
2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4、HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。
5、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
HTTP协议是无状态的和Connection: keep-alive的区别:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
对于请求:
请求行、消息报头、请求正文。
对于响应:
状态行、消息报头、响应正文。
解决HTTP无状态的问题
7.1、通过Cookies保存状态信息
通过Cookies,服务器就可以清楚的知道请求2和请求1来自同一个客户端。
7.2、通过Session保存状态信息
Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
HTTPS协议
1,客户端发起https请求连接,服务器返回公钥;
2,客户端产生自己的密钥和公钥,用服务器的公钥对客户端的密钥加密;
3,客户端发送加密后的密钥给服务器;
4,客户端用自己的公钥加密自己的信息进行通信。
下面是自己开发用的http请求代码:
1 -(void)sendRequestWithPost:(NSString *)str Param:(NSDictionary *)param success:(void (^)(id))success 2 3 { 4 5 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 6 7 manager.requestSerializer.timeoutInterval = 10; 8 9 if (!self.background) { //显示加载tips,无关HTTP 10 11 NSString* str = @"加载中..."; 12 13 if (self.myLoadingStrings) { 14 15 str = self.myLoadingStrings; 16 17 } 18 19 [self presentLoadingTips:str]; 20 21 } 22 23 24 25 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript", @"text/plain", nil]; //ACCEPT 类型设置 26 27 if (LOG_ABLE) { 28 29 LYLog(@"%@ request with %@", str, [param description]); 30 31 } 32 33 34 35 [manager POST:str parameters:param progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 36 37 if (!self.background) { 38 39 [self dismissTips]; 40 41 } 42 43 if (LOG_ABLE) { 44 45 LYLog(@"%@ \n response : %@", str, [responseObject description]); 46 47 } 48 49 success(responseObject); 50 51 NSDictionary* dict = responseObject; 52 53 if ([dict isKindOfClass:[NSDictionary class]] && [dict objectForKey:@"msg_code"]) { 54 55 NSNumber* code = [dict objectForKey:@"msg_code"]; 56 57 if (code.integerValue == 20013) { //session fail 58 59 60 61 [self lyModalLoginViewController]; 62 63 } 64 65 } 66 67 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 68 69 if (!self.background) { 70 71 [self dismissTips]; 72 73 [self presentMessageTips:@"操作失败"]; 74 75 } 76 77 LYLog(@"Error: %@", error); 78 79 LYLog(@"opertaion %@ error", [task description]); 80 81 if (error.code == kCFURLErrorBadServerResponse) { //特定的code 处理逻辑 82 83 [self lyModalLoginViewController]; 84 85 } 86 87 }]; 88 89 } 90 91
工具:Wireshark