HTTP协议
HTTP协议,Hyper Text Transfer Protocol(超⽂本传输协议)是 ⽤于从万维⺴服务器传送超⽂本到本地浏览器的传输协议,HTTP是 ⼀个应⽤层协议,由请求和响应构成,是⼀个标准的客户端服务器 模型。
http 3次握手 用户连续向服务器3次发送一样的请求 第三次服务器不再询问,开始执行
url:统一资源定位符,也被成为网址,因特网上标准的资源网址
url的符语法: 协议://授权/路径?查询
协议: ftp:// (文件传输协议) http://(超文本传输协议) https://(安全超文本传输协议) file://(本地文件协议)
GET与POST的区别:
GET:通过网址字符串 最多255字节
POST:使用NSData,容量超过1G
利用get请求 请求一个网址时 明文显示(携带的信息不安全)
post: 数据被转成NSData(二进制数据),类似于密码的密文输入,无法直接读取.
连接方式:
同步连接: 会造成程序的卡顿(只有当请求完成 才会恢复对界面的操作 用户体验很差)
异步连接:等待数据返回
异步连接有两种实现方式: 设置代理 接收数据
实现block
GET请求
不管同步还是异步前面4步的步骤是一样的
// 1.网址中有中文的需要转化一下格式 中文不能直接转 没有就不需要
NSString *newStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 2.把字符串的网址转化为网址对象
NSURL *url = [NSURL URLWithString:newStr];
// 3.创建一个请求
// timeoutInterval 请求超时的时间 秒为单位
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
// 4.设置一个请求的标志 标识符很重要
[request setHTTPMethod:@"GET"];
**同步时:**
// 5.建立同步连接 并得到返回的数据
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
后面两个对象可以为空 一个是服务器响应信息 一个是错误信息
// 6.解析数据
**异步时:**
代理方法:
// 5.利用请求 创建一个异步连接
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
// 6.开始连接
[self.connection start]
然后实现代理方法
a.接收到服务器的响应信息时触发的方法 连接成功里面 创建data
b.接收到数据触发的方法(走很多次)多次触发这个方法才能接收到完整的data 所以需要拼接一下data
[self.data appendData:data];
c.已经完成数据加载 触发的方法 解析数据在这里面进行 **如果在tableView上展示的话 注意刷新界面**
d.请求失败时触发
block异步连接方法
// [NSOperationQueue mainQueue]
// 代表回到主线程
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 当数据请求完成的时候会指定 这个block
NSLog(@"%@",data);
// 判断是否在主线程
NSLog(@"%d",[NSThread isMainThread]);
}];
POST与GET差不多,这不过POST的url与data是分开的
区别:POST请求 可以携带一个请求体
NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
其他是一样的.
获取服务器响应信息的长度 long long 类型的response.expectedContentLength
data.length 得到的data的长度
以获取到data的形式得到image
UIImage *image = [UIImage imageWithData:self.data];