网络编程(使用第三方框架和不使用第三方框架)

1.HTTP协议:全称为“超文本传输协议”,浏览器和服务器之间的通信方式

HTTP永远都是客户端发起请求,服务器回送响应

2.比较常用的请求方式有GET和POST请求,GET请求是向服务器索取数据的一种请求方式,GET请求时也可以发送数据;POST请求是向服务器提交数据的一种请求方式,比如用户登录等等,参数放在请求体中

3.GET与POST异同:GET带参数,参数拼接在URL地址后面?key=value&key=value,长度有限制,快;POST请求带参数,参数放在请求体中(body),相对安全,长度很大,相对来说慢;

4.HTTP请求主要由三部分组成:请求行,HTTP请求头,http请求体,post请求才有请求体

5HTTP响应主要由两部分组成:响应头,响应体;响应有个状态ma,表示响应的结果,200表示成功,404表示响应失败


  1,不使用第三方框架

NSURLSession(ios7之后用的)
  //五部曲 1.构造URL,//2构造可变的Request对象, //3.构造Session会话 //4.构造Task任务  //5.发送任务
(1)GET请求
  //1.构造URL, 参数直接拼接在url连接后, //GET请求, 也可以给服务器发送信息, 也有参数(微博用户名,用户id)
    
NSURL  *url = [ NSURL   URLWithString : @"http://news-at.zhihu.com/api/3/news/4602734 ];
   //2构造可变的 Request 对象
     NSMutableURLRequest  *request = [ NSMutableURLRequest   requestWithURL :url];
    
//(1)设置请求方式
    [request 
setHTTPMethod : @"GET" ];
    
//(2)超时时间
    [request 
setTimeoutInterval : 120 ];
    
//(3)缓存策略
    [request 
setCachePolicy : NSURLRequestReturnCacheDataElseLoad ];
 //告诉服务,返回的数据需要压缩
 [request  setValue : @"gzip"   forHTTPHeaderField : @"Accept-Encoding" ];
           //(4)设置请求头其他内容
     //[request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
    
//[request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
     //3.构造Session会话
    
NSURLSession  *session = [ NSURLSession   sharedSession ];
     //4.构造Task任务
    
NSURLSessionDataTask  *task = [session  dataTaskWithRequest :request  completionHandler :^( NSData  *data,  NSURLResponse  *response,  NSError  *error) {
        
        
if  (error ==  nil ) {
            
NSString  *dataStr = [[ NSString   alloc initWithData :data  encoding : NSUTF8StringEncoding ];
            
NSLog ( @"data: %@" , dataStr);
        }
    }];
     
//5.发送任务
    [task 
resume ];
2.post请求,和get请求差不多.post请求有请求体
//POST请求
    
//1.构造URL
    
NSURL  *url = [ NSURL   URLWithString : @"https://api.weibo.com/2/statuses/update.json" ];
    
    
//2.构造Request
    
NSMutableURLRequest  *request = [ NSMutableURLRequest   requestWithURL :url];
    
    
//(1)设置为POST请求
    [request 
setHTTPMethod : @"POST" ];
    
    
//(2)超时
    [request 
setTimeoutInterval : 60 ];
    
    
//(3)设置请求头
    
//[request setAllHTTPHeaderFields:nil];
    
    
//(4)设置请求体
    
//发微博
    
//请求体里需要包含至少两个参数
    
//指定用户的令牌   微博正文
    
//access_token    status
    
NSString  *bodyStr =  @"access_token=2.00TpCOFGgvN4eB4c8f6ca3cdBurugD&status=无限互联34班" ;
    
NSData  *bodyData = [bodyStr  dataUsingEncoding : NSUTF8StringEncoding ];
    [request 
setHTTPBody :bodyData];
    
//3.构造Session
    
NSURLSession  *session = [ NSURLSession   sharedSession ];
    
//4.task
    
NSURLSessionDataTask  *task = [session  dataTaskWithRequest :request  completionHandler :^( NSData  *data,  NSURLResponse  *response,  NSError  *error) {
        
NSLog ( @"response : %@" , response);
    }];
    
//5.发送任务
    [task 
resume ];

NSURLSessionDelegate
//1.url
    
NSURL  *url = [ NSURL   URLWithString : @"http://news-at.zhihu.com/api/3/news/latest" ];
    
    
//2.(request) configuration如果用配置对象就不需要使用request了
    
NSURLSessionConfiguration  *config = [ NSURLSessionConfiguration   defaultSessionConfiguration ];
    
/*
     requestCachePolicy : 设置缓存策略
     
     networkServiceType : 设置网络服务的类型:网络流量,网络电话,语音,视频..
     
     timeoutIntervalForRequest:设置超时时间
     
     HTTPAdditionalHeaders : 设置请求头
     
     discretionary : 用于后台请求,会把WiFi和电量的可用性考虑在内
     
     allowsCellularAccess : 是否允许使用蜂窝数据
     */

    
    config.
timeoutIntervalForRequest  =  120 ;
    config.
allowsCellularAccess  =  NO ;
    
//3.session
    
//NSURLSession *session = [NSURLSession sharedSession];
    
//通过配置config对象来创建session
    
//如果只是发送请求,使用以下方法, 系统会默认创建一个queue来处理session的消息
    
//NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
     
NSOperationQueue  *queue = [ NSOperationQueue   mainQueue ];//或者不在主线程上也可以
    
//(1)配置对象
    
//(2)代理对象, 可以监测请求过程, 是强引用的(strong)
    
//(3)操作队列, 可以设定delegate在指定的queue上面执行代理方法
    
NSURLSession  *session = [ NSURLSession   sessionWithConfiguration :config
                                                          
delegate : self
                                                     
delegateQueue :queue]; 
    
//4.task
    
NSURLSessionDataTask  *task = [session  dataTaskWithURL :url];
    
//5.resume
    [task 
resume ];
#pragma mark - 代理方法
//1.服务器返回响应头,就会调用
- (
void )URLSession:( NSURLSession  *)session
          dataTask:(
NSURLSessionDataTask  *)dataTask
didReceiveResponse:(
NSURLResponse  *)response
 completionHandler:(
void  (^)( NSURLSessionResponseDisposition ))completionHandler
{
    
//
    
NSHTTPURLResponse  *httpResponse = ( NSHTTPURLResponse  *)response;
    
    
NSLog ( @"%ld" , httpResponse. statusCode );
    
    
//接收到响应头,调用block,可以取消或者继续后面的数据传输
    
/*
     NSURLSessionResponseCancel = 0,    取消后面的数据传输
     NSURLSessionResponseAllow = 1,     继续传输
     NSURLSessionResponseBecomeDownload = 2,    把加载数据的模式转换为下载
     */

    
//调用block
    completionHandler(
NSURLSessionResponseAllow );
}
//2.响应体数据全部接收的时候,调用
- (
void )URLSession:( NSURLSession  *)session
          dataTask:(
NSURLSessionDataTask  *)dataTask
    didReceiveData:(
NSData  *)data
{
    
//data 是接收到的响应体数据
}
//3.一次任务执行完成
- (
void )URLSession:( NSURLSession  *)session
              task:(
NSURLSessionTask  *)task
didCompleteWithError:(
NSError  *)error
{
    
NSLog ( @"网络请求完成" );
}

使用第三方框架AFNetworking(包括5个部分:NSURLConnection,NSURLSession,Reachability(网络检测:就是wifi或者流量或者没网),Security,Serialization(序列化,用来设置request和response序列化方式)),将第三方框架导入后,再引入 #import  “AFNetworking.h"
1.GET请求
     //1.URL String
    
NSString  *urlStr =  @"http://news-at.zhihu.com/api/3/news/latest" ;
    
    
//2.AFHTTPSessionManager  管理网络请求
    
AFHTTPSessionManager  *manager = [ AFHTTPSessionManager   manager ];
    
//3.序列化对象, RequestSerializatin有两种方式 JSON  拼接
    
//(1)序列化请求的数据
    
// JSON  拼接
    
/*
     AFHTTPRequestSerializer :&拼接格式
     AFJSONRequestSerializer : JSON数据格式
     */

    manager.
requestSerializer  = [ AFHTTPRequestSerializer   serializer ];
    
//(2)解析响应数据
    
//AFURLResponseSerialization
    
//AFJSONResponseSerializer   JSON
    
//AFXMLParserResponseSerializer  XML
    
//AFPropertyListResponseSerializer  plist
    
//AFImageResponseSerializer   图片
    
//AFCompoundResponseSerializer  组合数据
    
//把返回响应数据解析为JSON格式的数据
    
//如果不设置解析的对象,默认不会解析数据
    manager.
responseSerializer  = [ AFJSONResponseSerializer   serializerWithReadingOptions : NSJSONReadingMutableContainers ];
//    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
//4.发GET请求
    
/**
     *  发GET请求
     *
     *  
@param  GET          接口的地址
     *  
@param  parameters   请求头或者其他参数
     *  
@param  success      请求成功的回调
     *  
@param  failure      请求失败的回调
     *
     */

    [manager 
GET :urlStr
      
parameters : nil
         
success :^( NSURLSessionDataTask  *task,  id  responseObject) {
             
//responseObject 收到的响应数据
             
NSLog ( @"response : %@" , responseObject);
             
             
NSDictionary  *data = responseObject;
             
NSString  * str = [data  objectForKey : @"date" ];
             
NSLog ( @"%@" , str);
             
         }
         
failure :^( NSURLSessionDataTask  *task,  NSError  *error) {
             
NSLog ( @"error %@" , error);
         }];

2.POST请求
//1.url string
    
NSString  *urlStr =  @"https://api.weibo.com/2/statuses/upload.json" ;
    
    
NSDictionary  *params =  @{
                             
@"access_token" @"2.00TpCOFGgvN4eB4c8f6ca3cdBurugD" ,
                             
@"status"  :  @"AF发条微博"
                             
} ;
    
//拼接参数到URL后面
    
//https://api.weibo.com/2/statuses/update.json access_token=2.00TpCOFGgvN4eB4c8f6ca3cdBurugD&status=AF发条微博
    
    
//2.manager
    
AFHTTPSessionManager  *manager = [ AFHTTPSessionManager   manager ];
    
    
//3.序列化
    
//(1)请求
    manager.
requestSerializer  = [ AFHTTPRequestSerializer   serializer ];
    
//(2)响应
    manager.
responseSerializer  = [ AFJSONResponseSerializer   serializerWithReadingOptions : NSJSONReadingMutableContainers ];
    
    
//4.发送请求
    
/*
    [manager POST:<#(NSString *)#>
       parameters:<#(id)#>
          success:<#^(NSURLSessionDataTask *task, id responseObject)success#>
          failure:<#^(NSURLSessionDataTask *task, NSError *error)failure#>];
     */

    
    [manager 
POST :urlStr
       
parameters :params
constructingBodyWithBlock :^( id < AFMultipartFormData > formData) {
    
//构造请求体
    
//formData 要上传的数据,需要添加的数据追加在formData的后面
    
NSString  *filePath = [[ NSBundle   mainBundle pathForResource : @"pic.JPG"   ofType : nil ];
    
NSData  *data = [ NSData   dataWithContentsOfFile :filePath];
    
    
//data: 要添加的数据
    
//name: 数据对应的key
    
//filename: 服务器可以接受的文件名
    
//mimeType: 文件的类型
    [formData 
appendPartWithFileData :data
                                
name : @"pic"
                            
fileName : @"file"
                            
mimeType : @"image/jpeg" ];
    
}
          
success :^( NSURLSessionDataTask  *task,  id  responseObject) {
              
NSLog ( @"response : %@" , responseObject);
          }
          
failure :^( NSURLSessionDataTask  *task,  NSError  *error) {
              
NSLog ( @"error : %@" , error);
          }];

3.download下载
//1.url string
    
NSString  *urlStr =  @"http://bcs.duapp.com/chenwei520/media/music.mp3" ;
    
//创建request
    
NSURLRequest  *request = [ NSURLRequest   requestWithURL :[ NSURL   URLWithString :urlStr]];
    
//2.manager
    
//默认的管理对象, 不支持后台下载
    
//AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
//后台下载,后台下载需要将配置对象设置成 backgroundSessionConfigurationWithIdentifier后台模式
    
NSURLSessionConfiguration  *config = [ NSURLSessionConfiguration   backgroundSessionConfigurationWithIdentifier : @"com.wxhl.AFNetworking" ];
    
AFHTTPSessionManager  *manager = [[ AFHTTPSessionManager   alloc initWithSessionConfiguration :config];
    
//3.序列化
    
//....
    
//progress 表示进度的对象的指针
    
NSProgress  *progress =  nil ;
    
    
//4.创建task任务
    
//request : 下载的请求
    
//progress: 下载的进度
    
//destination: 下载的文件的保存位置
    
//completionHandler: 下载完成的回调
    
NSURLSessionDownloadTask  *task = [manager  downloadTaskWithRequest :request
                            
progress :&progress
                         
destination :^ NSURL  *( NSURL  *targetPath,  NSURLResponse  *response) {
                             
//指定下载的文件的保存位置
                             
//返回值 NSURL 文件最后保存的位置
                             
NSString  *filePath = [ NSHomeDirectory ()  stringByAppendingString : @"/Documents/music.mp3" ];
                             
NSURL  *targetUrl = [ NSURL   fileURLWithPath :filePath];
                             
NSLog ( @"filePath : %@" , filePath);
                             
return  targetUrl;
                         }
                   
completionHandler :^( NSURLResponse  *response,  NSURL  *filePath,  NSError  *error) {
                       
NSLog ( @"%@" , response);
                   }];
    
//5.发送请求
    [task 
resume ];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值