http://www.cnblogs.com/YouXianMing/p/4291959.html
#import "ViewController.h"
#import?"AFNetworking.h"
@interface?MJViewController?()
@end
@implementation ViewController
/**
要使用常規(guī)的AFN網(wǎng)絡(luò)訪問
1.?AFHTTPRequestOperationManager?*manager?=?[AFHTTPRequestOperationManager?manager];
所有的網(wǎng)絡(luò)請求,均有manager發(fā)起
2.需要注意的是,默認(rèn)提交請求的數(shù)據(jù)是二進(jìn)制的,返回格式是JSON
1>如果提交數(shù)據(jù)是JSON的,需要將請求格式設(shè)置為AFJSONRequestSerializer
2>如果返回格式不是JSON的,
3.請求格式
AFHTTPRequestSerializer ?二進(jìn)制格式
AFJSONRequestSerializer????????????JSON
AFPropertyListRequestSerializer????PList(是一種特殊的XML,解析起來相對容易)
4.返回格式
AFHTTPResponseSerializer二進(jìn)制格式
AFJSONResponseSerializer???????????JSON
AFXMLParserResponseSerializer??????XML,只能返回XMLParser,還需要自己通過代理方法解析
AFXMLDocumentResponseSerializer?(Mac?OS?X)
AFPropertyListResponseSerializer???PList
AFImageResponseSerializer??????????Image
AFCompoundResponseSerializer組合
*/
-?(void)viewDidLoad
{
[super?viewDidLoad];
[self?reach];
}
#pragma?mark?-演練
#pragma?mark?-檢測網(wǎng)絡(luò)連接
-?(void)reach
{
/**
AFNetworkReachabilityStatusUnknown??????????=?-1,??//未知
AFNetworkReachabilityStatusNotReachable?????=?0,???//無連接
AFNetworkReachabilityStatusReachableViaWWAN?=?1,???//?3G花錢
AFNetworkReachabilityStatusReachableViaWiFi?=?2,???//局域網(wǎng)絡(luò),不花錢
*/
//如果要檢測網(wǎng)絡(luò)狀態(tài)的變化,必須用檢測管理器的單例的startMonitoring
[[AFNetworkReachabilityManager?sharedManager]?startMonitoring];
//檢測網(wǎng)絡(luò)連接的單例,網(wǎng)絡(luò)變化時(shí)的回調(diào)方法
[[AFNetworkReachabilityManager?sharedManager]?setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus?status)?{
NSLog(@"%d",?status);
}];
}
#pragma?mark?-?Session下載
-?(void)sessionDownload
{
NSURLSessionConfiguration?*config?=?[NSURLSessionConfiguration?defaultSessionConfiguration];
AFURLSessionManager?*manager?=?[[AFURLSessionManager?alloc]?initWithSessionConfiguration:config];
NSString?*urlString?=?@"http://localhost/itcast/videos/01.C語言-語法預(yù)覽.mp4";
urlString?=?[urlString?stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL?*url?=?[NSURL?URLWithString:urlString];
NSURLRequest?*request?=?[NSURLRequest?requestWithURL:url];
NSURLSessionDownloadTask?*task?=?[manager?downloadTaskWithRequest:request?progress:nil?destination:^NSURL?*(NSURL?*targetPath,?NSURLResponse?*response)?{
//指定下載文件保存的路徑
//????????NSLog(@"%@?%@",?targetPath,?response.suggestedFilename);
//將下載文件保存在緩存路徑中
NSString?*cacheDir?=?NSSearchPathForDirectoriesInDomains(NSCachesDirectory,?NSUserDomainMask,?YES)[0];
NSString?*path?=?[cacheDir?stringByAppendingPathComponent:response.suggestedFilename];
//?URLWithString返回的是網(wǎng)絡(luò)的URL,如果使用本地URL,需要注意
NSURL?*fileURL1?=?[NSURL?URLWithString:path];
NSURL?*fileURL?=?[NSURL?fileURLWithPath:path];
NSLog(@"==?%@?||||?%@",?fileURL1,?fileURL);
return?fileURL;
}?completionHandler:^(NSURLResponse?*response,?NSURL?*filePath,?NSError?*error)?{
NSLog(@"%@?%@",?filePath,?error);
}];
[task?resume];
}
#pragma?mark?-?POST?JSON
-?(void)postJSON
{
AFHTTPRequestOperationManager?*manager?=?[AFHTTPRequestOperationManager?manager];
NSDictionary?*dict?=?@{@"name":?@"zhangsan"};
NSDictionary?*dict1?=?@{@"name":?@"wangwu"};
NSArray?*array?=?@[dict,?dict1];
//設(shè)置請求格式
manager.requestSerializer?=?[AFJSONRequestSerializer?serializer];
//設(shè)置返回格式
manager.responseSerializer?=?[AFHTTPResponseSerializer?serializer];
[manager?POST:@"http://localhost/postjson.php"?parameters:array?success:^(AFHTTPRequestOperation?*operation,?id?responseObject)?{
NSString?*result?=?[[NSString?alloc]?initWithData:responseObject?encoding:NSUTF8StringEncoding];
NSLog(@"%@",?result);
}?failure:^(AFHTTPRequestOperation?*operation,?NSError?*error)?{
}];
}
#pragma?mark?-隨機(jī)文件名上傳
-?(void)postUpload1
{
//本地上傳給服務(wù)器時(shí),沒有確定的URL,不好用MD5的方式處理
AFHTTPRequestOperationManager?*manager?=?[AFHTTPRequestOperationManager?manager];
manager.responseSerializer?=?[AFHTTPResponseSerializer?serializer];
[manager?POST:@"http://localhost/demo/upload.php"?parameters:nil?constructingBodyWithBlock:^(id?formData)?{
NSURL?*fileURL?=?[[NSBundle?mainBundle]?URLForResource:@"頭像1.png"?withExtension:nil];
//要上傳保存在服務(wù)器中的名稱
//使用時(shí)間來作為文件名2014-04-30?14:20:57.png
//讓不同的用戶信息,保存在不同目錄中
NSDateFormatter?*formatter?=?[[NSDateFormatter?alloc]?init];
//設(shè)置日期格式
formatter.dateFormat?=?@"yyyy-MM-dd?HH:mm:ss";
NSString?*fileName?=?[formatter?stringFromDate:[NSDate?date]];
[formData?appendPartWithFileURL:fileURL?name:@"uploadFile"?fileName:fileName?mimeType:@"image/png"?error:NULL];
}?success:^(AFHTTPRequestOperation?*operation,?id?responseObject)?{
NSLog(@"OK");
}?failure:^(AFHTTPRequestOperation?*operation,?NSError?*error)?{
NSLog(@"error");
}];
}
#pragma?mark?-?POST上傳
-?(void)postUpload
{
AFHTTPRequestOperationManager?*manager?=?[AFHTTPRequestOperationManager?manager];
//?AFHTTPResponseSerializer就是正常的HTTP請求響應(yīng)結(jié)果:NSData
//當(dāng)請求的返回?cái)?shù)據(jù)不是JSON,XML,PList,UIImage之外,使用AFHTTPResponseSerializer
//例如返回一個(gè)html,text...
//
//實(shí)際上就是AFN沒有對響應(yīng)數(shù)據(jù)做任何處理的情況
manager.responseSerializer?=?[AFHTTPResponseSerializer?serializer];
//?formData是遵守了AFMultipartFormData的對象
[manager?POST:@"http://localhost/demo/upload.php"?parameters:nil?constructingBodyWithBlock:^(id?formData)?{
//將本地的文件上傳至服務(wù)器
NSURL?*fileURL?=?[[NSBundle?mainBundle]?URLForResource:@"頭像1.png"?withExtension:nil];
[formData?appendPartWithFileURL:fileURL?name:@"uploadFile"?error:NULL];
}?success:^(AFHTTPRequestOperation?*operation,?id?responseObject)?{
NSString?*result?=?[[NSString?alloc]?initWithData:responseObject?encoding:NSUTF8StringEncoding];
NSLog(@"完成%@",?result);
}?failure:^(AFHTTPRequestOperation?*operation,?NSError?*error)?{
NSLog(@"錯(cuò)誤%@",?error.localizedDescription);
}];
}
#pragma?mark?-?POST登錄
-?(void)postLogin
{
AFHTTPRequestOperationManager?*manager?=?[AFHTTPRequestOperationManager?manager];
//原本需要拼接get訪問URL???&?=
NSDictionary?*dict?=?@{@"username":?@"wangwu",?@"password"?:?@"wang"};
//網(wǎng)絡(luò)訪問是異步的,回調(diào)是主線程的,因此程序員不用管在主線程更新UI的事情
[manager?POST:@"http://localhost/login.php"?parameters:dict?success:^(AFHTTPRequestOperation?*operation,?id?responseObject)?{
NSLog(@"%@",?responseObject);
//提問:NSURLConnection異步方法回調(diào),是在子線程
//得到回調(diào)之后,通常更新UI,是在主線程
NSLog(@"%@",?[NSThread?currentThread]);
}?failure:^(AFHTTPRequestOperation?*operation,?NSError?*error)?{
NSLog(@"%@",?error);
}];
}
#pragma?mark?-?GET登錄
-?(void)getLogin
{
AFHTTPRequestOperationManager?*manager?=?[AFHTTPRequestOperationManager?manager];
//原本需要拼接get訪問URL???&?=
NSDictionary?*dict?=?@{@"username":?@"wangwu",?@"password"?:?@"wang"};
//網(wǎng)絡(luò)訪問是異步的,回調(diào)是主線程的,因此程序員不用管在主線程更新UI的事情
[manager?GET:@"http://localhost/login.php"?parameters:dict?success:^(AFHTTPRequestOperation?*operation,?id?responseObject)?{
NSLog(@"%@",?responseObject);
//提問:NSURLConnection異步方法回調(diào),是在子線程
//得到回調(diào)之后,通常更新UI,是在主線程
NSLog(@"%@",?[NSThread?currentThread]);
}?failure:^(AFHTTPRequestOperation?*operation,?NSError?*error)?{
NSLog(@"%@",?error);
}];
}
@end