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" : @"創(chuàng)建請求"}];
[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>
/**
* 接收到網(wǎng)絡請求
*/
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"接收到網(wǎng)絡數(shù)據(jù) %@" , response);
self.response = response;
if ([response isKindOfClass:[NSHTTPURLResponse class]])
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//取到狀態(tài)碼:
NSInteger statusCode = httpResponse.statusCode;
//取到請求頭部:
NSDictionary *headerDic = httpResponse.allHeaderFields;
NSLog(@"statusCode = %@" , @(statusCode));
NSLog(@"headerDic = %@" , headerDic);
}
//初始化一個空的data:
self.responseData = [NSMutableData data];
}
/**
* 接收到網(wǎng)絡數(shù)據(jù)
*/
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"正在接收網(wǎng)絡數(shù)據(jù) %@" , data);
if (nil != data) {
[self.responseData appendData:data];
}
}
/**
* 完成網(wǎng)絡請求
*/
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"網(wǎng)路請求完成 = %@", connection);
NSLog(@"currentRequest = %@" , connection.currentRequest);
//網(wǎng)絡請求完成后把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);
}
/**
* 網(wǎng)絡請求失敗
*/
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"網(wǎng)路請求失敗 = %@" , 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
{
//發(fā)送網(wǎng)絡會話請求任務:
//創(chuàng)建請求地址:
NSURL *url = [NSURL URLWithString:kURLString];
//創(chuàng)建請求:
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//創(chuàng)建會話:
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//會話根據(jù)網(wǎng)絡請求創(chuàng)建出網(wǎng)絡任務:
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];
//如果存在回調信息就執(zhí)行該回調:
if (completionHandler) {
//繼續(xù)接收從服務器返回的數(shù)據(jù):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;
//創(chuàng)建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