目录
一. 用第三方库实现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]; }
创建数据源和表格视图, 实现表格视图代理方法