AppDelegate.m
#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *vc = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController = nav;
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
- (void)applicationWillTerminate:(UIApplication *)application {
}
@end
ViewController.m
#import "ViewController.h"
typedef NS_ENUM(NSInteger , MDDemoType)
{
MDDemoTypeRequest = 0,
MDDemoTypeConnection,
MDDemoTypeSession,
MDDemoTypeSessionDelegate,
MDDemoTypePostConnection,
MDDemoTypePostSession,
};
static NSString *const kReuseIdentifier = @"kReuseIdentifier";
//static NSString *const kURLString = @"https://api.douban.com/v2/book/17604305?fields=title,id,url,publisher,author";
NSString * const kURLString = @"http://putsreq.com/0SMBaDzt2mCQn8UHXAir";
@interface ViewController ()<UITableViewDelegate , UITableViewDataSource , NSURLConnectionDelegate , NSURLConnectionDataDelegate , NSURLSessionDelegate , NSURLSessionDataDelegate , NSURLSessionTaskDelegate , NSURLSessionDownloadDelegate>
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray<NSDictionary *> *dataSourceArray;
@property (nonatomic, strong) NSURLResponse *response;
@property (nonatomic, strong) NSMutableData *responseData;
@property (nonatomic, copy) NSString *responseString;
@property (nonatomic, strong) id responseInfo;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self loadTableView];
[self loadData];
}
#pragma mark - loadTableView
- (void)loadTableView
{
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kReuseIdentifier];
[self.view addSubview:self.tableView];
}
#pragma mark - loadData
- (void)loadData
{
self.dataSourceArray = [NSMutableArray array];
[self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeRequest] , @"title" : @"创建请求"}];
[self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeConnection] , @"title" : @"NSURLConnection"}];
[self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeSession] , @"title" : @"NSURLSession"}];
[self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypeSessionDelegate] , @"title" : @"NSURLSession delegate"}];
[self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypePostConnection] , @"title" : @"POST请求 NSURLConnection"}];
[self.dataSourceArray addObject:@{@"tag" : [NSNumber numberWithInteger:MDDemoTypePostSession] , @"title" : @"POST请求 NSURLSession"}];
}
#pragma mark - <UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataSourceArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kReuseIdentifier];
cell.textLabel.text = [self.dataSourceArray[indexPath.row] objectForKey:@"title"];
return cell;
}
#pragma mark - <UITableViewDelegate>
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
MDDemoType demoType = [[self.dataSourceArray[indexPath.row] objectForKey:@"tag"] integerValue];
switch (demoType) {
case MDDemoTypeRequest:
[self testRequest];
break;
case MDDemoTypeConnection:
[self testNSURLConnection];
break;
case MDDemoTypeSession:
[self testSession];
break;
case MDDemoTypeSessionDelegate:
[self testSessionDelegate];
break;
case MDDemoTypePostConnection:
[self testPostConnection];
break;
case MDDemoTypePostSession:
[self testPostSession];
break;
default:
break;
}
}
/**
* Demo...
*/
#pragma mark - testRequest
- (void)testRequest
{
NSURL *url = [NSURL URLWithString:kURLString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// [request setValue:@"testRequest" forHTTPHeaderField:@"User-Agent"];
request.allHTTPHeaderFields = @{@"application/json" : @"Content-Type",
@"testRequest" : @"User-Agent"};
}
#pragma mark - testNSURLConnection
- (void)testNSURLConnection
{
NSURL *url = [NSURL URLWithString:kURLString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection start];
}
#pragma mark - <NSURLConnectionDelegate>
/**
* 接收到网络请求
*/
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"接收到网络数据 %@" , response);
self.response = response;
if ([response isKindOfClass:[NSHTTPURLResponse class]])
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//取到状态码:
NSInteger statusCode = httpResponse.statusCode;
//取到请求头部:
NSDictionary *headerDic = httpResponse.allHeaderFields;
NSLog(@"statusCode = %@" , @(statusCode));
NSLog(@"headerDic = %@" , headerDic);
}
//初始化一个空的data:
self.responseData = [NSMutableData data];
}
/**
* 接收到网络数据
*/
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"正在接收网络数据 %@" , data);
if (nil != data) {
[self.responseData appendData:data];
}
}
/**
* 完成网络请求
*/
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"网路请求完成 = %@", connection);
NSLog(@"currentRequest = %@" , connection.currentRequest);
//网络请求完成后把data文件转成可读的string类型:
self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:nil];
NSLog(@"self.responseInfo = %@" , self.responseInfo);
}
/**
* 网络请求失败
*/
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"网路请求失败 = %@" , error);
NSLog(@"currentRequest = %@" , connection.currentRequest);
}
#pragma mark - testSession
- (void)testSession
{
NSURL *url =[NSURL URLWithString:kURLString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
self.response = response;
self.responseData = [NSMutableData dataWithData:data];
self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:&error];
}];
[task resume];
}
#pragma mark - testSessionDelegate
- (void)testSessionDelegate
{
//发送网络会话请求任务:
//创建请求地址:
NSURL *url = [NSURL URLWithString:kURLString];
//创建请求:
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//创建会话:
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//会话根据网络请求创建出网络任务:
NSURLSessionTask *task = [session dataTaskWithRequest:request];
//开启任务:
[task resume];
}
#pragma mark - <NSURLSessionDelegate>
//接收到响应:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
self.response = response;
self.responseData = [NSMutableData data];
//如果存在回调信息就执行该回调:
if (completionHandler) {
//继续接收从服务器返回的数据:NSURLSessionResponseAllow;
completionHandler(NSURLSessionResponseAllow);
}
}
//接收响应信息中...:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
[self.responseData appendData:data];
}
//响应接收完成或者响应接收失败打印错误信息:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
//处理错误:
if (error)
{
NSLog(@"error = %@", error);
}
else
{
self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:nil];
}
}
#pragma mark - testPostConnection
- (void)testPostConnection
{
NSURL *url = [NSURL URLWithString:kURLString];
NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url];
mutableRequest.HTTPMethod = @"POST";
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *parameters = @{
@"book": @(17604305),
@"title":@"好书",
@"comment":@"我觉得这是一本好书",
@"rating":@(5)
};
NSData *body = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
mutableRequest.HTTPBody = body;
//创建connection链接:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:mutableRequest delegate:self startImmediately:NO];
[connection start];
}
#pragma mark - testPostSession
- (void)testPostSession
{
NSURL *url = [NSURL URLWithString:kURLString];
NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url];
mutableRequest.HTTPMethod = @"POST";
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *parameters = @{
@"book": @(17604305),
@"title":@"好书",
@"comment":@"我觉得这是一本好书",
@"rating":@(5)
};
NSData *body = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
mutableRequest.HTTPBody = body;
//delegate方式:
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionTask *task = [session dataTaskWithRequest:mutableRequest];
[task resume];
/*
//block方式:
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
self.response = response;
self.responseData = [NSMutableData dataWithData:data];
self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:&error];
NSLog(@"%@" , self.responseString);
}];
[task resume];
*/
}
#pragma mark - 内存警告
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end