目錄
一. 用第三方庫實現get請求
1. ASI
2. AFNetworking
二. Post請求的實現
1. NSURLConnection
2. ASI
3. AFNetworking
三. 使用MKNetworkingKit實現get和Post
1. get請求
2. Post請求
一. 用第三方庫實現get請求
ASI
- ASI是較老的第三方庫, 功能非常強大, 可以實現get/post請求, 實現數據的緩存, 實現斷點續傳功能
- 由于ASI不支持ARC, 并且ASI庫的作者已經不再維護這個工程, 所有支持ARC的功能沒有實現, 一般新的項目不推薦使用
- ASIHttpRequest: ASI最主要的一個類, 這個類是繼承于NSOperation
AFNetworking
- AFNetworking是iOS6之后的網絡請求庫, 能夠實現get/post請求, 可以實現斷點續傳等功能
- AFNetworking使用簡單, 支持ARC, 一般新的工程都會使用其進行
1. ASI實現get請求的使用步驟
- 導入ASI第三方庫
設置為-fno-objc-arc
-
添加系統庫文件
- SystemConfiguration,
- CFNetwork,
- MobileCoreServices
- libz.1.1.3.dylib
-
導入頭文件使用
- 創建ASIHttpRequest對象
- 設置代理, 遵守協議
- 發送請求(異步請求)
-
代碼
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.chengmi.com/shindex?passdate=20150108&curlng=121.5093155189223&curlat=31.27483773025054"]]; request. delegate = self; [request startAsynchronous];
-
ASIHttpRequest代理方法
// 下載失敗時調用 - (void)requestFailed:(ASIHTTPRequest *)request { NSLog(@"%s", __func__); } // 下載結束后調用 - (void)requestFinished:(ASIHTTPRequest *)request { // request.responseData存儲下載回來的二進制數據 // JSON解析 id result = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableContainers error:nil]; ………………………………………………………………………………………… }
常規流程: 創建數據源和表格視圖, 實現表格視圖代理方法
2. AFNetworking
- 導入AFNetworking庫文件
-
導入頭文件使用
- 創建"AFHTTPRequestOperationManager"類型的對象
- 設置返回值的解析方式(二進制)
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; - 發送請求
第一個參數: 請求的url字符串
第二個參數: 附加的參數(傳nil)
第三個參數: 請求成功返回時調用的代碼塊(block)
第四個參數: 請求失敗時調用的代碼塊
注意的兩點
block代碼塊的執行是異步的
block里面的變量通常會拷貝, 所以里面使用self指向的視圖控制器對象時, 通常使用弱引用, 否則會有內存泄露
-
用AFNetworking實現get請求
- (void)downloadData
{
// 1. 導入AFNetworking庫文件
// 2. 導入頭文件使用
// 1) 創建"AFHTTPRequestOperationManager"類型的對象
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];// 2) 設置返回值的解析方式(二進制) manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 3) 發送請求 /* 第一個參數: 請求的url字符串 第二個參數: 附加的參數(傳nil) 第三個參數: 請求成功返回時調用的代碼塊(block) 第四個參數: 請求失敗時調用的代碼塊 */ // 4) 注意的兩點 // 1. block代碼塊的執行是異步的 // 2. block里面的變量通常會拷貝, 所以里面使用self指向的視圖控制器對象時, 通常使用弱引用, 否則會有內存泄露 __weak ViewController *weakSelf = self; [manager GET:@"http://api.chengmi.com/shindex?passdate=20150108&curlng=121.5093155189223&curlat=31.27483773025054" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { // responseObject 存儲了下載回來的數據 // JSON解析 id result = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; if ([result isKindOfClass:[NSDictionary class]]) { NSDictionary *dict = result; for (NSDictionary *sectionDict in dict[@"sectioninfo"]) { DataModel *model = [[DataModel alloc] init]; [model setValuesForKeysWithDictionary:sectionDict]; [weakSelf.dataArray addObject:model]; } [weakSelf.tableView reloadData]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error:%@", error); }]; }
常規流程: 創建數據源和表格視圖, 調用下載數據方法, 實現表格視圖代理方法
二. Post請求的實現
post請求: 參數不放在url字符串里面, 而是放在請求體里面, 安全性比較高, 而且傳遞的參數數據量會比較大
post請求不能直接在瀏覽器訪問
1. 使用系統的NSURLConnection完成Post請求
- 創建NSURL類型對象
-
創建NSMutableURLRequest類型對象, 設置對象的屬性
- 設置請求體
- 設置請求方式
- 設置請求參數的大小
發送請求
-
downloadData方法
- (void)downloadData
{
// 1. 創建NSURL類型對象
NSURL *url = [NSURL URLWithString:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet"];
// 2. 創建NSMutableURLRequest類型對象
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
NSString *param = @"sessionKey=7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D&pageSize=10&rtype=2&pageIndex=0&m=getLiteraturegroupBySpecialty";
// 轉化為二進制數據
NSData *paramData = [param dataUsingEncoding:NSUTF8StringEncoding];// 1) 設置請求體 [request setHTTPBody:paramData]; // 2) 設置請求方式 [request setHTTPMethod:@"post"]; // 3) 設置請求參數的大小 NSString *lengthStr = [NSString stringWithFormat:@"%ld", paramData.length]; [request setValue:lengthStr forHTTPHeaderField:@"content-length"]; // 4) 設置類型 [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; // 3.發送請求 _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; }
創建數據源和表格視圖, 實現NSURLConnection代理方法和表格視圖代理方法
2. 使用第三方庫ASI完成Post請求
使用ASI進行Post請求
- (void)downloadData
{
// 1. 導入ASI第三方庫
// 2. 添加編譯屬性-fno-objc-arc
// 3. 添加系統庫
// 4. 導入頭文件
// 1)
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet"]];
// 2) 設置代理
request.delegate = self;
// 3) 請求方式
request.requestMethod = @"POST";
// 4)
[request setPostValue:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"];
[request setPostValue:@"10" forKey:@"pageSize"];
[request setPostValue:@"2" forKey:@"rtype"];
[request setPostValue:@"0" forKey:@"pageIndex"];
[request setPostValue:@"getLiteraturegroupBySpecialty" forKey:@"m"];
// 5) 發送請求(異步請求)
[request startAsynchronous];
}創建數據源和表格視圖, 實現ASIHttpRequest代理方法和表格視圖代理方法
-
ASI可以上傳文件或圖片(代碼寫在發送請求之前)
// 上傳文件 // 第一個參數: 文件的路徑 // 第二個參數: key值 // request setFile:<#(NSString *)#> forKey:<#(NSString *)#> // 上傳圖片 // 第一個參數: 文件的路徑 // 第二個參數: 文件的名字 // 第三個參數: 文件的類型(image/png) // 第四個參數: key // request setFile:<#(NSString *)#> withFileName:<#(NSString *)#> andContentType:<#(NSString *)#> forKey:<#(NSString *)#>
3. 使用AFNetworking完成Post請求
-
AFNetworking進行Post請求
- (void)downloadData { // 1. 導入AFnetworking庫文件 // 2. 導入頭文件使用 // 1) 創建AFHTTPRequestOperationManager AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init]; // 2) 設置返回值為二進制類型 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 3) 請求數據 /* 第一個參數: url地址 第二個參數: Post請求的參數, 放在一個字典中 第三個參數: 請求成功返回調用的代碼塊 第四個參數: 請求失敗調用的代碼塊 */ // 請求參數放到一個字典里面 NSMutableDictionary *parameterDict = [NSMutableDictionary dictionary]; [parameterDict setObject:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"]; [parameterDict setObject:@"10" forKey:@"pageSize"]; [parameterDict setObject:@"2" forKey:@"rtype"]; [parameterDict setObject:@"0" forKey:@"pageIndex"]; [parameterDict setObject:@"getLiteraturegroupBySpecialty" forKey:@"m"]; // 4) 注意的兩點 // 1. block代碼塊的執行是異步的 // 2. block里面的變量通常會拷貝, 所以里面使用self指向的視圖控制器對象時, 通常使用弱引用, 否則會有內存泄露 __weak ViewController *weakSelf = self; [manager POST:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet" parameters:parameterDict success:^(AFHTTPRequestOperation *operation, id responseObject) { // JSON數據 id result = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; if ([result isKindOfClass:[NSDictionary class]]) { NSDictionary *dict = result; NSLog(@"%@", dict); for (NSDictionary *objDict in dict[@"obj"]) { DataModel *model = [[DataModel alloc] init]; [model setValuesForKeysWithDictionary:objDict]; [weakSelf.dataArray addObject:model]; } [weakSelf.tableView reloadData]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error:%@", error); }]; }
創建數據源和表格視圖, 實現表格視圖代理方法
-
AFNetworking可以上傳文件或圖片
manager POST:(NSString *) parameters:(id) constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 上傳文件的時候會使用 // formData appendPartWithFileURL:<#(NSURL *)#> name:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#> // 上傳圖片 // 第四個參數:@"image/png" // formData appendPartWithFileData:<#(NSData *)#> name:<#(NSString *)#> fileName:<#(NSString *)#> mimeType:<#(NSString *)#> } success:<#^(AFHTTPRequestOperation *operation, id responseObject)success#> failure:<#^(AFHTTPRequestOperation *operation, NSError *error)failure#>
三. 使用MKNetworkingKit實現get和Post
1. get請求
-
下載數據方法
- (void)downloadData
{
// 1. MKNetworkKit文件夾拖入項目,然后引入4個framework:
// CFNetwork.framework , SystemConfiguration.framework , Security.framework, ImageIO.framework// 2. 注意主機名HostName不能加"http://", 程序會自動添加, 主機要指向一個目錄, 不可以是一個具體文件, 如上類不可以是"www.***.net/json/conn.asp" MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"iappfree.candou.com:8080" customHeaderFields:nil]; MKNetworkOperation *operation = [engine operationWithPath:@"/free/applications/limited?currency=rmb&page=1" params:nil httpMethod:@"GET" ssl:NO]; [operation addCompletionHandler:^(MKNetworkOperation *operation) { id result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil]; if ([result isKindOfClass:[NSDictionary class]]) { NSDictionary *dict = result; for (NSDictionary *appDict in dict[@"applications"]) { DataModel *model = [[DataModel alloc] init]; [model setValuesForKeysWithDictionary:appDict]; [self.dataArray addObject:model]; } [self.tableView reloadData]; } } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) { NSLog(@"MKNetwork request error : %@", [err localizedDescription]); }]; [engine enqueueOperation:operation]; }
創建數據源和表格視圖, 實現表格視圖代理方法
2. Post請求
-
下載數據方法
- (void)downloadData
{
// 1. MKNetworkKit文件夾拖入項目,然后引入4個framework:
// CFNetwork.Framework , SystemConfiguration.framework , Security.framework// 2. 注意主機名HostName不能加"http://", 程序會自動添加, 主機要指向一個目錄, 不可以是一個具體文件, 如上類不可以是"www.***.net/json/conn.asp" MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet" customHeaderFields:nil]; NSMutableDictionary *paramsDict = [NSMutableDictionary dictionary]; [paramsDict setObject:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"]; [paramsDict setObject:@"10" forKey:@"pageSize"]; [paramsDict setObject:@"2" forKey:@"rtype"]; [paramsDict setObject:@"0" forKey:@"pageIndex"]; [paramsDict setObject:@"getLiteraturegroupBySpecialty" forKey:@"m"]; MKNetworkOperation *operation = [engine operationWithPath:nil params:paramsDict httpMethod:@"POST"]; [operation addCompletionHandler:^(MKNetworkOperation *operation) { id result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil]; if ([result isKindOfClass:[NSDictionary class]]) { NSDictionary *dict = result; NSLog(@"%@", dict); for (NSDictionary *objDict in dict[@"obj"]) { DataModel *model = [[DataModel alloc] init]; [model setValuesForKeysWithDictionary:objDict]; [_dataArray addObject:model]; } [_tableView reloadData]; } } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) { NSLog(@"MKNetwork request error : %@", [err localizedDescription]); }]; [engine enqueueOperation:operation]; }
創建數據源和表格視圖, 實現表格視圖代理方法