HTTP 协议 相关概念
与HTTPS
一 HTTP协议概念
HTTP(Hypertext Transfer Protocol[超文本传输协议]) 是一个无状态的面向对象的一个应用层协议, 由请求和响应构成, 完成超文本数据从网络端到客户端的传输,HTTP协议是一个标准的客户端服务器模型.
二 HTTP协议的特点:
- 支持客户/服务器模式
- 简单快速
- 灵活: HTTP支持任意类型的对象传输正在传输的对象类型有Content-type加以标记
- HTTP协议1.1版本后继续使用持续链接
- 无状态: HTTP协议是一种无状态协议
三 HTTP协议的作用
- 规定客户端和服务器端之间的数据传输格式
- 让客户端和服务器端有效的进行沟通
四 HTTP下得通信过程
- 请求: 客户端向服务器端所要数据
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
请求行:包含了请求方法、请求资源路径、HTTP协议版本
GET /MJServer/resources/images/1.jpg HTTP/1.1
请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息
Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境
Accept: text/html, */*// 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式
请求体:客户端发给服务器的具体数据,比如文件数据
- 响应: 服务器端向客户端返回数据
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
HTTP协议规定:1个完整的HTTP响应中包含以下内容:
状态行:包含了HTTP协议版本、状态码、状态英文名称
HTTP/1.1 200 OK
响应头:包含了对服务器的描述、对返回数据的描述
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
实体内容:服务器返回给客户端的具体数据,比如文件数据
常见的状态码
五 HTTP 协议常见的请求方式
- 同步GET请求~ 异步GET请求
- 同步POST请求~ 异步POST请求
六 发送HTTP请求的方法
**
1.简单说明
在HTTP/1.1协议中,定义了8种发送http请求的方法
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
PUT :增
DELETE :删
POST:改
GET:查
提示:最常用的是GET和POST(实际上GET和POST都能办到增删改查)
**
六 iOS中发送HTTP请求的方案
在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有
(1)苹果原生(自带)
NSURLConnection:用法简单,最古老最经典最直接的一种方案
NSURLSession:iOS 7新出的技术,功能比NSURLConnection更加强大
CFNetwork:NSURL*的底层,纯C语言
(2)第三方框架
ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新
AFNetworking:简单易用,提供了基本够用的常用功能
建议:
为了提高开发效率,企业开发用的基本是第三方框架
网络请求的使用
- NSURL 这个类封装了一个网络路径
- NSURLRequest 我们通过这个设置一些网络的请求信息
- NSURLMutableURLRequest 这个类时NSURLRequest的子类, 可以设置一些请求的参数
- NSURLResponse 这个类包含了一些从服务器返回的信息
- NSError 这个类包含了我们在网络请求中遇到的错误信息
- 同步/异步
1.1 同步下载的操作步骤实例
- 同步/异步
1> 创建NSURL
NSURL *url = [[[NSURL alloc] initWithString: @"http//best50.cn"];
2> 通过URL创建NSURLRequest
NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URLObject]; //默认 GET 请求
//NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachesPolicy: //NSURLRequestUserProtocolCachePolicy timeoutInterval: 15];
//第一个参数为访问路径, 第二个参数为:缓存协议 第三个参数为网络请求超时时间(秒)
3> 建立网络连接NSURLConnection, 同步请求数据
//NSData *receivedData = (NSMutableData *)[NSURLConnection sendSynchronousRequest:request //retruningResponse: &response error :&error];
//其中response为NSURLResponse 类的对象, 用于接收服务器返回的响应, error 为NSError类, 用于接收网络访问过程出现的错误信息
//声明response
NSHTTPURLResponse *HTTPResponse = nil;
// NSData *receivedData = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:&HTTPResponse error:nil];
4>数据解析
1.2 异步下载的操作步骤实例
1) 创建NSURL
NSURL *url = [NSURL URLWithString:@""];
2) 通过URL创建NSURLRequest
NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URLObject];
//NSURLRequest *request = [[NSRULRequest alloc] initWitURL:url cachePlicy: //NSURLRequestUseProtocolCachePolicy timeoutInterval: 15];
3)建立网络连接NSURLConnection, 并设置代理
[NSURLConnection connectionWithRequest: request delegate: self];
4) 需要实现的代理: NSURLConnectionDataDelegate, NSURLConnectionDelegate
代理方法 1>
接收到服务器回应的时候调用此方法
- (void) connection:(NSURLConnection *)connection didREceiveReponse:(NSURLReponse *)reponse
{
NSLog(@"%@",response);//当服务器端正确响应请求后, 会在响应消息的报头部分提供一些数据, 不如需要被下载的文件的总大小
NSLog(@"%s",__FUNCTION__);//根据HTTP协议的原理, 客户端在发出请求后, 如果得到服务器端的响应, 会执行此方法, 表示数据下载即将开始.
}
代理方法 2>
当前网络链接建立成功后, 就开始不断的获取服务器端传输的数据;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.receivedData appendData:data];
}
代理方法 3>
数据传送完后调用此方法
- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
//此方法可以得到最终的receivedData
}
代理方法 4>
网络请求中出现任何错误, 会进入此方法
- (void) connection:(NSURLConnection *)conncetion didFailWithError:(NSError *)error {}
1.3 对比
同步请求会阻塞主线程, 会使用户失去UI交互, 出现程序卡死的情况, 只有在同步下载结束后, UI才可以接收用户的交互
异步请求即使用多线程, 两者互不影响
2. GET请求 和 POST请求
特点
* GET请求:参数都写在访问路径上了
* POST请求:请求参数都放在body里面了
* GET请求: 操作简单, 所有参数直接写到地址里面就可以了, POST:操作相对复杂, 需要将参数和地址分开写
* GET请求:参数容易被外界看到, 安全性不高 POST请求: 参数都放在了body里面了, 所有不易被捕获, 安全性高
* GET请求:地址最多长度限制为255字节,多余的部分会被截掉 POST请求: 因为参数都在body中, 所有不存在限制问题
2.1 GET请求操作步骤
1) 设置请求路径
NSURL *url = [NSURL URLWithString:@""];
2) 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
3) 发送请求
2.1 POST请求操作步骤
1) 设置请求路径
NSURL *url = [NSURL URLWithString:@""];
2) 创建一个请求 (NSURLRequest), 把访问地址放到请求里面
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url];
3)设置请求方式 不设置的话默认为GET请求(GET请求)
[request setHTTPMethod:@"POST"];
4) 设置参数体
a,将参数转化为NSData类型
NSData *postData = [arguments dataUsingEncoding:NSUTF8StringEncoding];
NSString*arguments = [NSString stringWithFormat:@""];
b. 将NSData类型的参数放入请求体中
[request setHTTPBody:postData];