几种传输协议
ftp: // (⽂件传输协议)
http: // (超⽂本传输协议)
https: // (安全超文本传输协议)
file: // (本地文件协议)
HTTP协议
url的符语法: 协议://授权/路径?查询
⼀个典型的HTTP协议url:
http://lily:123456@www.google.com/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
HTTP协议的请求方式
HTTP协议的请求方式有两种: GET 和 POST
每种方式都有同步请求和异步请求两种方式
GET 和 POST 两种请求⽅式⽐较:
1、给服务器传输数据的⽅式:
GET:通过⺴址字符串。
POST:通过data
2、传输数据的⼤⼩:
GET:⺴址字符串最多255字节。
POST:使⽤NSData,容量超过1G
3、安全性:
GET:所有传输给服务器的数据,显⽰在⺴址⾥,类似于密码的明⽂输⼊,直接可⻅。
POST:数据被转成NSData(⼆进制数据),类似于密码的密⽂输⼊,⽆法直接读取。
同步和异步的比较:
同步连接:程序容易出现卡死现象
异步连接:等待数据返回。
异步联接有两种实现⽅式:
1.设置代理,接收数据
2.block
GET请求
1.同步连接
// 同步请求
// 同步请求 会造成程序的卡顿(只有当请求完成 才会恢复对界面的操作 用户的体验很差)
- (void)leftButtonClick:(UIBarButtonItem *)leftButton
{
// 注意: 如果网址中有中文 需要转化一下格式
// 转化为编码格式
NSString *newStr = [kSearchURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
// 把字符串的网址 转换成网址对象
NSURL *url = [NSURL URLWithString:newStr];
// 创建一个请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
// 设置一个请求标识
// 加标识符很重要 标识符必须为get或者post
[request setHTTPMethod:@"Get"];
// 利用这个请求 创建一个链接
NSError *error = nil;
NSURLResponse *response = nil;
// 建立同步链接 并得到返回的数据(data)
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"%@",response);
NSLog(@"%@",data);
// 解析数据
NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dic);
}
2.1异步连接– block
- (void)rightButtonClick:(UIBarButtonItem *)rightButton
{
// 获取一个网址对象(有中文 需要转码)
NSString *urlStr = [kSearchURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlStr];
// 利用网址创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
// 标识请求类型
[request setHTTPMethod:@"Get"];
// block异步链接
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 当数据请求完成的时候 会执行这个block
NSLog(@"%@",data);
// 判断是否在主线程
NSLog(@"%d",[NSThread isMainThread]);
}];
2.2异步连接 – 代理
- (void)rightButtonClick:(UIBarButtonItem *)rightButton
{
// 获取一个网址对象(有中文 需要转码)
NSString *urlStr = [kSearchURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlStr];
// 利用网址创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
// 标识请求类型
[request setHTTPMethod:@"Get"];
// 利用请求 创建一个异步链接(需设置代理)
// 将connection设置成属性 因为controller在触发dealloc时 connection需要调用cancel方法
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
// 开始链接
[self.connection start];
#pragma mark -- 代理方法的 异步链接
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"请求失败时触发 %@",error);
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// 链接成功时 创建data
// 同样 data也需要设置成属性
self.receiveData = [NSMutableData data];
NSLog(@"已经接收到服务器的响应信息,说明链接成功");
NSLog(@"%@",response);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 可能多次触发这个方法 才能接收到 完整的data
// 所以这时候需要拼接一下data
[self.receiveData appendData:data];
NSLog(@"接收到数据时触发的方法");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"%@",self.receiveData);
// 解析数据
NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.receiveData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dic);
// 如果在tableView 上显示的话
// 注意: 要刷新界面
NSLog(@"已经完成数据加载 触发的方法");
}
POST请求
1.同步连接
// Post同步
- (void)leftButtonClick:(UIBarButtonItem *)leftButton
{
// 创建网址对象
NSURL *url = [NSURL URLWithString:kNewsListURL];
// 利用网址对象 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
// 设置一个标识
// 必须设置 而且只能写POST
[request setHTTPMethod:@"POST"];
// 把字符串转化成data 使用UTF-8的编码格式(将携带的请求体转变为data)
NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
// 注意区别: POST请求 可以携带一个请求体
[request setHTTPBody:data];
// 创建链接
NSData *newData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 解析数据
NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:newData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dic);
}
POST请求 的 异步连接 的 block 和 代理方法 同 Get请求