/**
安全:GET请求(参数直接在网址中)是不安全的;POST请求(参数作为请求体单独提交)安全.
*/
/**
同步连接和异步连接的区别:
同步连接:网络请求任务交由主线程完成,当主线程请求数据时,所有的用户交互都无法处理,影响用户体验.
异步连接:网络请求任务交由子线程去完成,当子线程请求数据时,主线程依然可以处理用户交互.用户体验好.
*/
GET:
//同步请求
- (IBAction)handleSychronize:(id)sender {
//网址字符串.
NSString *urlSrtr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//网址字符串中若含汉字,特殊符号等,需要进行编码转化.
//ios9之前采用的编码转换方法
// [urlSrtr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
urlSrtr = [urlSrtr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
//1.创建NSURL网址对象
NSURL *url = [NSURL URLWithString:urlSrtr];
//2.创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.连接服务器
NSURLResponse *respondse = nil;//服务器的响应对象.
NSError *error = nil;//存储链接失败的错误信息.
/**
* 同步请求:相当于把耗时的网络请求放到同一个线程(每一个程序至少有一个线程,平时写的代码都是主线程下执行的)中处理,当数据过大时,会产生界面卡顿.
*/
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&respondse error:&error];
//data就是我们通过网址从服务器请求到的数据.
}
//异步请求
- (IBAction)handleAsychronize:(id)sender {
//网址字符串
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//创建NSURL网址对象
NSURL *url = [NSURL URLWithString:urlStr];
//创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//连接服务器
//参数2:[NSOperationQueue mainQueue] 获取主线程队列. 所给的线程决定block内部代码执行是在哪个线程下(UI界面上的刷新,用户交互,必须放在主线程执行.若在子线程中执行,可能会出现未知问题);
//异步请求的第一种方式: block形式.
/*
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//请求完成后才会回调, 返回对应的数据Data.
//response 服务器响应对象
//data 服务器返回的数据
//connectionError 连接的错误信息
//解析数据
NSLog(@"%@",data);
}];
*/
//异步请求第二种方式:delegate形式
[NSURLConnection connectionWithRequest:request delegate:self];
}
#pragma mark - NSURLConnectionDataDelegate -
//收到服务器响应的时候
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//该方法是在建立连接过程中触发的,只会执行一次.
//再次创建NSMutableData对象 用于拼接返回的数据
self.mutData = [NSMutableData data];
//response服务器响应对象
NSLog(@"%lld",response.expectedContentLength);
}
//接收到数据时
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[self.mutData appendData:data];
}
//数据传输结束时
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//解析数据
NSLog(@"%@",self.mutData);
}
//连接失败时
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"%@",error);
}
POST:
//同步请求
- (IBAction)handleSychrnize:(id)sender {
//1.网址字符串
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//2.若存在汉字或特殊符号 需编码转化
//3.创建网址对象
NSURL *url = [NSURL URLWithString:urlStr];
//4.创建请求(可变请求对象)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//5.创建参数字符串
NSString *parmStr =@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//6.参数字符串转为NSData
NSData *body = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
//7.设置请求体
[request setHTTPBody:body];
//8.设置请求方式:(默认请求方式是GET);
[request setHTTPMethod:@"POST"];
//requestHeader
NSDictionary *headers = [NSDictionary dictionaryWithObject:@"Bearer YWMtP_8IisA-EeK-a5cNq4Jt3QAAAT7fI10IbPuKdRxUTjA9CNiZMnQIgk0LEUE${token}" forKey:@"Authorization"];
[request setAllHTTPHeaderFields:headers];
//连接服务器,发送请求
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"%@",data);
}
//异步请求
- (IBAction)handleAsychrnize:(id)sender {
//1.创建网址字符串
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//2.创建网址对象
NSURL *url = [NSURL URLWithString:urlStr];
//3.创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//4.设置请求体
//参数字符串
NSString *parmStr =@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *body =[parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:body];
//5.设置请求方式
[request setHTTPMethod:@"POST"];
//异步连接
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _NullableconnectionError) {
NSLog(@"%@",data);
}];
}
session:
//
// SessionViewController.m
// UISenior-DataRequest
//
// Created by Eric on 16/4/11.
// Copyright © 2016年 Eric. All rights reserved.
//
#import "SessionViewController.h"
@interface SessionViewController ()<NSURLSessionDataDelegate>
{
long long allBytes;//存储数据总长度;
}
@property(nonatomic,strong)NSMutableData *mData;
@end
@implementation SessionViewController
/**
NSURLConnection在ios9.0之后被弃用;
替代 使用NSURLSession
主要提供三种功能:1.数据请求:NSURLSessionDataTask
2.下载 :NSURLSessionDownloadTask
3.上传 : NSURLSessionUploadTask
*/
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//获取数据
// [self loadDataFromServer];
//GET请求
// [self getData];
//POST请求
// [self postAction];
//获取数据
// [self configureSession];
//获取数据 使用delegate形式
[self delegateAction];
}
//使用session代理的方式 请求数据
-(void)delegateAction{
//1.URL
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURLURLWithString:@"http://img.zcool.cn/community/0332de1559f800a32f875370ac09559.jpg"]];
//使用代理形式请求数据:不能使用全局的对话对象
NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];
//创建session 创建的同时设置代理对象.
NSURLSession *session = [NSURLSession sessionWithConfiguration:configure delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//发起任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//开启任务.
[dataTask resume];
}
#pragma mark -NSURLSessionDelegate -
//服务器收到响应时
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
//允许响应 继续接受数据 (如果不写执行到此就结束)
completionHandler(NSURLSessionResponseAllow);
//创建mData
self.mData = [NSMutableData data];
allBytes = response.expectedContentLength;
}
//接收数据时
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData*)data{
//每次返回一部分数据 需要拼接
[self.mData appendData:data];
//获取当前获取数据的百分比
double scale = self.mData.length*1.0 /allBytes;
self.scaleLable.text = [NSString stringWithFormat:@"%.2f%%",scale*100];
self.image.image = [UIImage imageWithData:self.mData];
// NSLog(@"%lf",scale);
}
//接收数据完成时
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError*)error{
if (!error) {
NSLog(@"%@",self.mData);
}
}
//使用自己创建的Session发起任务.
//一般项目中,建议程序中少创建session,减少底层建立连接的过程.
- (void)configureSession{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"]];
//创建对话配置对象(对会话进行设置)
/**
* 支持三种类型:default默认的;
临时会话
后台
*/
NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configure];
//使用自己创建的会话创建任务.
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullabledata, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",data);
}];
[task resume];
}
//POST请求
-(void)postAction{
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
//创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求方式
[request setHTTPMethod:@"POST"];
//设置请求体
NSString *parmStr =@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *body = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody =body;
//创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *_Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",data);
}];
//手动开启任务.
[dataTask resume];
}
//GET请求
-(void)getData{
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
NSURLRequest *request = [NSURLRequest requestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:-1];
//3. NSURLSession对象
NSURLSession *session = [NSURLSession sharedSession];//获取系统为我们提供的全局绘画.
//4.创建数据请求任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}];
[task resume];
}
-(void)loadDataFromServer{
//网址字符串
NSString *str = @"http://img.zcool.cn/community/0332de1559f800a32f875370ac09559.jpg";
//创建NSURL对象
NSURL *url = [NSURL URLWithString:str];
//创建请求
/*参数①:网址对象
参数②:缓存策略
参数③: 超时时间 给-1代表不设置超时时间.
*/
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
//使用session请求数据
//创建一个NSURLSession对象(网络绘画对象)
NSURLSession *session = [NSURLSession sharedSession];
//请求数据 创建 NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullabledata, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//data就是从服务器获取的数据.
//response服务器响应对象
//error 连接错误信息.
// NSLog(@"%@",data);
//1.界面上的处理需要回到主线程,执行界面刷新任务
// [self performSelectorOnMainThread:@selector(refreshUI:) withObject:data waitUntilDone:YES];
//2.GCD方式 回到主线程
dispatch_async(dispatch_get_main_queue() , ^{
self.image.image =[UIImage imageWithData:data];
});
}];
//手动开始执行任务
[dataTask resume];
}
//刷新界面操作
- (void)refreshUI:(NSData *)data{
self.image.image = [UIImage imageWithData:data];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end