UI进阶——数据请求

一、http与https协议

URL全称是uniform Resource Locator(统一资源定位符)。
基本格式为:协议://主机地址/路径
https协议比http协议多了一个加密步骤。
关于网络请求的返回错误,常见的一些网络错误:
 404:服务器找不到指定的资源,请求的页面不存在(例如,浏览器请求的网页已被删除或转移,但不排除链接有效的可能性); 
 410:所请求的页面不存在(注:410代表一个永久的,暂时的,404); 
 200:服务器成功返回请求的页面; 
 301永久重定向的URL 
 302:你用的是360浏览器
一般而言,浏览器只支持http请求里的GET请求。

二、http请求方式(iOS中)

常见的请求有GET请求和POST请求。

不同点:

1.给服务器传输数据的方式不同:
GET:通过网址字符串
POST:通过data
2.传输数据的大小
GET:网址字符串最多255字节(目前可以达到1kb)
POST:使用NSData
3.安全性
GET:所有传输给服务器的数据,显示在网址里,类似于密码的明文输入,直接可见。
POST:数据被转化为NSData(二进制数据),类似于密码的密文输入。

三、编程实现网络请求

首先,在Xcode的info.plist文件里需要修改信息,使其支持http请求。


上demo:
//get的同步请求
-(void)getAndSychronous{
    
    //第一步,得到服务器地址(统一资源定位符)
    NSString *URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    //网址
    NSURL *url = [NSURL URLWithString:URLStr];
    //创建网络请求
    NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];
    //创建同步链接
    NSError* error;
    //在这里运用的是废弃的方法
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:&error];
    //解析传回的json数据
    NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
    
}

//get异步请求
-(void)getAndAsychronous{
    
    //第一步,得到服务器地址(统一资源定位符)
    NSString *URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
    //网址
    NSURL *url = [NSURL URLWithString:URLStr];
    //创建网络请求
    NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];
    //异步请求block
    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&connectionError];
        NSLog(@"%@",dic);
    }];
    NSLog(@"异步请求---------*");
}
//Post同步请求
-(void)postAndsychronous{
    //post请求,一般只需要,协议:主机地址:路径
    NSString* URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    //创建路径
    NSURL* url = [NSURL URLWithString:URLStr];
    //设置请求方式
    NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
    //不设置的时候默认为get请求
    [mReq setHTTPMethod:@"POST"];
    //设置参数
    NSString* pStr = @"date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
    NSData* pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
    //为请求设置参数
    [mReq setHTTPBody:pData];
    //建立同步链接
    NSData *data = [NSURLConnection sendSynchronousRequest:mReq returningResponse:nil error:nil];
    NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
    
}
//post异步 协议代理
-(void)postAndAsychronous{
    
    //建立路径
    NSString* pStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    NSURL *url = [NSURL URLWithString:pStr];
    //初始化请求
    NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
    //设置请求参数
    NSString* str =@"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [mReq setHTTPMethod:@"POST"];
    [mReq setHTTPBody:data];
    
    //开始异步请求
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:mReq delegate:self];
}

#pragma mark <NSURLConnectionDelegate,NSURLConnectionDataDelegate>
//开始响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    
    NSLog(@"开始响应,可以初始化容器");
    //将要开始返回数据
    self.mData = [[NSMutableData alloc]init];
    
    
}
//接受数据,data只是数据片段,需要我们进行拼接
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"开始接受数据片段");
    [self.mData appendData:data];
    
}
//链接完成
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"本次链接完成");
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.mData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
}

//链接出错的代理方法
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"error-----%@",error);
}

//session的get请求
- (void)sessionGet{
    //获取全局对象
    NSURLSession* session = [NSURLSession sharedSession];
    
    /*//设置工作模式的方法
    NSURLSessionConfiguration* confi = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *sessionSet = [NSURLSession sessionWithConfiguration:confi];*/
    
    //创建URL对象
    NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
    //不需要设置请求超时打开
    /*//建立请求任务
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
        NSLog(@"在block里解析的数据------%@",dic);
        
    }];
    //启动请求任务
    [task resume];*/
    //需要设置请求超时,第二个参数为缓存策略
    NSURLRequest* req = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
    //建立任务
    NSURLSessionTask* task = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString* str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"str==%@",str);
    }];
    [task resume];
}

//session的post请求
-(void)sessionPost{
    
    //设置网址
    //post请求,一般只需要,协议:主机地址:路径
    NSString* URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    //创建路径
    NSURL* url = [NSURL URLWithString:URLStr];
    //设置请求对象,只要设置请求方式,就必须是可变的请求对象
    NSMutableURLRequest* req = [[NSMutableURLRequest alloc]initWithURL:url];
    //设置请求方式,不设置的话,默认为GET方式
    [req setHTTPMethod:@"POST"];
    //设置参数
    NSString* pStr = @"date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
    NSData* pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
    //为请求设置参数,注意参数类型,需要的是NSData类型
    [req setHTTPBody:pData];
    //得到全局的session对象
    NSURLSession *session = [NSURLSession sharedSession];
    //设置加载任务的对象
    NSURLSessionDataTask* task = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString* str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",str);
    }];
    //任务开始
    [task resume];
}

//session的post代理请求
-(void)sessionPostDelegate{
    
    //设置网址
    NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
    //建立请求对象
    NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
    //设置请求对象的请求超时
    [mReq setTimeoutInterval:30];
    //设置请求对象的请求方法
    [mReq setHTTPMethod:@"POST"];
    //设置请求对象的请求参数
    NSString* str = @"date=20151031&startRecord=1&len=10&udid=1234567890&terminalType=Iphone&cid=213";
    NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [mReq setHTTPBody:data];
    //建立全局对象,用以创建请求任务
    NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
    
    NSURLSessionTask* task = [session dataTaskWithRequest:mReq];
    [task resume];
}

#pragma mark <NSURLSessionDataDelegate>
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    NSLog(@"服务器开始响应,准备返回数据");
    //允许处理服务器对象,才会进行下一步操作
    completionHandler(NSURLSessionResponseAllow);
    //当网络请求为http时,response的实质是NSHTTPURLResponse类型
    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
    //创建可变的data,准备接收请求的字符片段。
    self.mData = [NSMutableData data];
    
}

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    NSLog(@"服务器开始返回数据");
    //开始接收每次收到的data数据
    [self.mData appendData:data];
}

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    NSLog(@"数据接收完成,网络请求成功");
    //转化接收回来的数据
    if (!error) {
        NSString *str = [[NSString alloc]initWithData:self.mData encoding:NSUTF8StringEncoding];
        NSLog(@"我是请求回来的数据%@",str);
    }else{
        NSLog(@"%@",error);
    }
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值