UI高级第五课 网络通信——iOS学习连载33

1.http协议:全称“超文本传输协议”,浏览器和服务器之间的通信规则
2.HTTP协议永远是客户端发起请求,服务器回送响应
3.用户发送请求的方式:“ GET ”和“POST”请求
  • GET”请求:向服务器索取数据的一种请求方式
  • “POST”请求:向服务器提交数据的一种请求方法,如“用户登录”等等
4.HTTP请求主要由两部分组成:http请求头、http请求体
注意:只有POST请求才有请求体
5.请求的参数有两种形式:(1)放在URL后面 (2)放在请求体中
6.HTTP响应主要由两部分组成:响应头、响应内容
7.HTTP响应有个状态码,表示响应的结果,例如:404表示未找到页面
8.访问网络的方式:同步请求、异步请求
  • 同步请求:数据的请求过程是在主线程来执行的。但网络数据加载需要一个时间过程,这样会阻塞主线程
  • 异步请求:数据的请求过程在多线程中来执行
  • 同步请求无法取消,异步请求过程中可以取消;同步请求无法监听加载进度,异步请求可以监听
9.访问网络的基本流程:
  • 构造URL地址
  • 生成NSURLRequest请求
  • 通过NSURLConnection发送请求
  • 通过返回NSURLRespond实例和NSError实例分析结果
  • 接受返回数据
10.同步请求:
  //1. 构建 URL 地址
   
   //2. 构建请求 NSURLRequest
    //NSURLRequest: 不可变对象,不能动态地添加请求信息
   
NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL :url];
   
//2.1 设置请求方式
    [request
setHTTPMethod : @"GET" ];
   
//2.2 设置超时时间
    [request
setTimeoutInterval : 60 ];
   
//2.3 设置请求头信息
//    [request setAllHTTPHeaderFields:<#(NSDictionary *)#>];
//    [request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
//    [request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
    [request
setValue : @"gzip" forHTTPHeaderField : @"Accept-Encoding" ];
   
   
//2.4 设置请求体(只有POST请求才有请求体)
//    [request setHTTPBody:<#(NSData *)#>];
   
    //2.5设置缓存(只有GET请求才能缓存)
    [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
  //3. 构造 NSURLConnection, 发送网络请求
   
   
NSHTTPURLResponse *response = nil ;
   
NSError *error = nil ;
   
   
// 发送同步请求
    NSData *data = [ NSURLConnection sendSynchronousRequest :request returningResponse :&response error :&error];
    //4. 获取数据显示
   
// data 转成字符串
   
NSString *jsonStr = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ];
   
self . textView . text = jsonStr;
   
   
// 解析 json 数据
    NSDictionary *dic = [ NSJSONSerialization JSONObjectWithData :data options : NSJSONReadingMutableContainers error : nil] ;
    NSLog ( @" 数据结果 :%@" , dic);
    //5. 获取响应信息
   
NSInteger statusCode = response. statusCode ;
   
NSDictionary *allHeaderFields = response. allHeaderFields ;
   
11.异步请求
//1. 构建 URL 地址
   
NSURL *url = [ NSURL URLWithString : @"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000" ];

   
//2. 构建 Request
   
NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] init ];
    [request
setURL :url];
    [request
setTimeoutInterval : 60 ];
    [request
setHTTPMethod : @"POST" ];
   
   
// 添加请求数据
   
NSString *paras = @"cinema_id=1533" ;
   
NSData *data = [paras dataUsingEncoding : NSUTF8StringEncoding ];
    [request
setHTTPBody :data];
   
    //3.发送请求
    // 发送异步请求(基于 block ),无法监听数据传输,也不能监听传输的速度
   
//NSOperationQueue 队列,请求的线程会被添加到对列中
   
//completionHandler :数据请求完之后,调用此 block ,此 block 是多线程调用的
   
NSOperationQueue *queue = [[ NSOperationQueue alloc ] init ];
    [
NSURLConnection sendAsynchronousRequest :request queue :queue completionHandler :^( NSURLResponse *response, NSData *data, NSError *connectionError) {
       
if (connectionError)
        {
           
return ;
           
        }
       
// 多线程调用
       
NSString *jsonStr = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ];
       
// 回到主线程刷新 UI
       
dispatch_async ( dispatch_get_main_queue (), ^{
           
self . textView . text = jsonStr;

        });
       
    }];
12. #pragma mark - NSURLConnectionDataDelegate
// 接收到服务器的响应
- (
void )connection:( NSURLConnection *)connection didReceiveResponse:( NSHTTPURLResponse *)response
{
   
NSDictionary *fields = response. allHeaderFields ;
   
NSLog ( @"fields is %@" ,fields);
   
   
self . recevieData = [[ NSMutableData alloc ] init ];
   
}

// 接收服务器传输的数据,如果数据量足够大,此方法会被调用多次,因为数据是分批次传输的
- (
void )connection:( NSURLConnection *)connection didReceiveData:( NSData *)data
{
   
// 对每次传输的数据进行拼接
    [
self . recevieData appendData :data];
   
   
NSLog ( @" 接收到 %ld 字节的数据 " ,data. length );
}

- (
void )connectionDidFinishLoading:( NSURLConnection *)connection
{
   
NSLog ( @" 数据接收完成 " );
   
   
// data 转成字符串
   
NSString *jsonStr = [[ NSString alloc ] initWithData : self . recevieData encoding : NSUTF8StringEncoding ];
   
self . textView . text = jsonStr;
   
   
// 将接收到的数据保存到沙盒
//    [self.recevieData writeToFile:[NSHomeDirectory() stringByAppendingString:@"/QQMusic.dmg"] atomically:YES];
}

// 请求失败调用的协议方法
- (
void )connection:( NSURLConnection *)connection didFailWithError:( NSError *)error
{
   
NSLog ( @" 请求失败 " );
}

13.AF
  •  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
     所有的网络请求,均有manager发起
   
  • 需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON,如果提交数据是JSON,需要将请求格式设置为AFJSONRequestSerializer
  • 请求格式
    AFHTTPRequestSerializer            二进制格式
    AFJSONRequestSerializer            JSON
    AFPropertyListRequestSerializer    PList(是一种特殊的XML,解析起来相对容易)
  • 返回格式
    AFHTTPResponseSerializer           二进制格式
    AFJSONResponseSerializer           JSON
    AFXMLParserResponseSerializer      XML,
只能返回 XMLParser, 还需要自己通过代理方法解析
    AFXMLDocumentResponseSerializer    (Mac OS X)
    AFPropertyListResponseSerializer   PList
    AFImageResponseSerializer          Image
    AFCompoundResponseSerializer       组合

    NSString *urlString =  @"https://api.weibo.com/2/statuses/update.json" ;
   
     NSDictionary *params = @{ @"status" : @“需要 发布的微博内容 " , @"access_token" : @"2.00dW_qRD2O4AeEf6026c7ed50053l5" } ;
方法一:
    AFHTTPRequestSerializer *requestSerializer = [ AFHTTPRequestSerializer serializer ];
    NSMutableURLRequest *request = [requestSerializer requestWithMethod:@" POST " URLString:urlString parameters:params error:nil];
    //2. 构建连接操作对象
    AFHTTPRequestOperation *operation = [[ AFHTTPRequestOperation alloc ] initWithRequest :request];
    //3. 设置返回数据的解析方式
     JSON 解析: AFJSONResponseSerializer
     XML解析:AFXMLParserResponseSerializer
    operation. responseSerializer = [ AFJSONResponseSerializer serializerWithReadingOptions : NSJSONReadingMutableContainers ];
   
   
// 设置数据请求成功、失败调用的 block
    [operation
setCompletionBlockWithSuccess :^( AFHTTPRequestOperation *operation, id responseObject) {
       
// 请求成功
       
NSLog ( @"responseObject is %@" , responseObject);
    }
failure :^( AFHTTPRequestOperation *operation, NSError *error) {
       
// 请求失败
       
NSLog ( @"error is %@" , error);
    }];
   
   
// 添加到队列中,发送请求
   
queue = [[ NSOperationQueue alloc ] init ];
    [queue addOperation:operation];
方法二:
// 所有的网络请求,均有manager发起  
AFHTTPRequestOperationManager *manager = [ AFHTTPRequestOperationManager manager ];
   
     AFHTTPRequestOperation *operation = [manage POST :urlString  parameters :params success :^( AFHTTPRequestOperation *operation, id responseObject) {
       
NSLog ( @"responseObject is %@" ,responseObject);
    }
failure :^( AFHTTPRequestOperation *operation, NSError *error) {
       
NSLog ( @"error is %@" ,error);
    }];
   
    operation.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];

14.TCP与UDP区别:
TCP:(1)面向连接   (2)可靠   (3)传输大量数据  (4)慢
UDP:(1)面向非连接 (2)不可靠  (3)传输少量数据  (4)快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值