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

来源:互联网 发布:java ee eclipse教程 编辑:程序博客网 时间:2024/05/17 22:29

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 allocinitWithData: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 mainBundlepathForResource:@"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 allocinitWithSessionConfiguration: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];


0 0
原创粉丝点击