iOS开发——网络请求案例汇总(AFNetworking)
来源:互联网 发布:vendor.js做什么用的 编辑:程序博客网 时间:2024/05/21 17:37
我在之前一篇博客中实现了使用NSURLConnection或者NSURLSession来请求网络数据,用的都是苹果自带的方法。请参考《iOS开发——网络请求案例汇总》。现在我们使用最流行的AFNetworking库来进行网络请求。代码我已经上传至https://github.com/chenyufeng1991/iOS-NetworkRequest 。
【1.AFNetworking请求SOAP】
SOAP一般需要我们发送XML数据,返回的一般也是XML数据。我这里用的也是http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx 。这个网站的手机号码归属地查询。不过经过我测试,时间延迟会比较长。。实现方式如下:
#import "AFNsoapViewController.h"#import <AFNetworking.h>@interface AFNsoapViewController ()@end@implementation AFNsoapViewController- (void)viewDidLoad { [super viewDidLoad]; // 创建SOAP消息,内容格式就是网站上提示的请求报文的主体实体部分 这里使用了SOAP1.2; NSString *soapMsg = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap12:Envelope " "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " "xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">" "<soap12:Body>" "<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">" "<mobileCode>%@</mobileCode>" "<userID>%@</userID>" "</getMobileCodeInfo>" "</soap12:Body>" "</soap12:Envelope>", @"18888888888", @""]; NSURL *url = [NSURL URLWithString: @"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"]; NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMsg length]]; [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [req addValue:msgLength forHTTPHeaderField:@"Content-Length"]; [req setHTTPMethod:@"POST"]; [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]]; AFHTTPRequestOperation *operate = [[AFHTTPRequestOperation alloc] initWithRequest:req]; operate.responseSerializer = [AFHTTPResponseSerializer serializer]; [operate setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"成功:%@",result); } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { NSLog(@"成功:%@",error); }]; [operate start]; }@end
打印结果如下:
。
【2.AFHTTPRequestOperationManager请求Http】
这里直接用一个链接请求服务器数据,可以使用GET或者POST请求。参数直接写入到链接中。实现方式如下:
#import "AFNHttp1ViewController.h"#import <AFNetworking.h>@interface AFNHttp1ViewController ()@end@implementation AFNHttp1ViewController- (void)viewDidLoad { [super viewDidLoad]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //这里改成POST,就可以进行POST请求; //把要传递的参数直接放到URL中;而不是放到字典中; [manager GET:@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18888888888&userId=" parameters:nil success:^(AFHTTPRequestOperation *operation,id responseObject){ NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"成功: %@", string); } failure:^(AFHTTPRequestOperation *operation,NSError *error){ NSLog(@"失败: %@", error); }];}@end
。
【3.AFHTTPRequestOperationManager请求Http改进版】
在2的例子中,我们把参数放到了请求的链接中,并不是特别的方便,这里我们使用字典来存放需要发送的数据。实现如下:
#import "AFNHttp2ViewController.h"#import <AFNetworking.h>@interface AFNHttp2ViewController ()@end@implementation AFNHttp2ViewController- (void)viewDidLoad { [super viewDidLoad]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSDictionary *dic = @{@"mobileCode":@"18888888888", @"userID":@""}; //这里改成POST,就可以进行POST请求; [manager GET:@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo" parameters:dic success:^(AFHTTPRequestOperation *operation,id responseObject){ NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"成功: %@", string); } failure:^(AFHTTPRequestOperation *operation,NSError *error){ NSLog(@"失败: %@", error); }];}@end打印结果与2一样。
【4.AFHTTPRequestOperation请求Http】
在3的例子中,我们通过发送参数列表和链接地址来进行网络请求。现在我们设置一个Request,把这些数据都放到request参数中,然后通过只发送一个request来实现。
#import "AFNHttp3ViewController.h"#import <AFNetworking.h>@interface AFNHttp3ViewController ()@end@implementation AFNHttp3ViewController- (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString: @"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18888888888&userId="]; NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; [req setHTTPMethod:@"GET"]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:req]; operation.responseSerializer = [AFHTTPResponseSerializer serializer]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"成功:%@",result); } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { NSLog(@"失败:%@",error); }]; [operation start]; }@end
【5.AFnetworking发送XML进行Http请求】
这种方式平时不多见,这里把“***”作为字典中的键,把XML作为字典中的值进行发送。并且还要进行安全性的设置。实现代码如下:
#import "AFNXMLHttpViewController.h"#import <AFNetworking.h>@interface AFNXMLHttpViewController ()@end@implementation AFNXMLHttpViewController- (void)viewDidLoad { [super viewDidLoad]; /* 这里需要进行如下的安全性设置; 使用AFNetworking发送XML,如果不进行如下的设置,将会报错: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.} */ AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init]; [securityPolicy setAllowInvalidCertificates:YES]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager setSecurityPolicy:securityPolicy]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSString *str = @"这里存放需要发送的XML"; NSDictionary *parameters = @{@"test" : str};//test是这个XML对应的名字 [manager POST:@"需要发送的链接" parameters:parameters success:^(AFHTTPRequestOperation *operation,id responseObject){ NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"成功: %@", string); } failure:^(AFHTTPRequestOperation *operation,NSError *error){ NSLog(@"失败: %@", error); }]; }@end
总结,使用AFNetworking进行网络请求还是比较简单的,我会继续深入的研究AFNetworking,有任何成果都会分享给大家。
最近开源的iOS应用,高仿印象笔记 https://github.com/chenyufeng1991/iOS-Oncenote 。欢迎大家点赞并关注项目进度。也可以安装到手机上试玩哦。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!
- iOS开发——网络请求案例汇总(AFNetworking)
- iOS开发——网络请求案例汇总
- iOS开发 - AFNetworking网络请求
- iOS开发 - AFNetworking网络请求
- iOS开发: AFNetworking网络请求:NSURLSession版
- ios AFNetworking网络请求
- iOS-95-网络请求方式汇总(包含AFNetworking、NSMutableURLRequest)
- iOS AFNetworking 取消网络请求
- iOS中网络请求--AFNetworking
- iOS开发之网络开发——AFNetWorking
- iOS开发之网络请求(基于AFNetworking的再封装)
- iOS开发之网络请求(基于AFNetworking的再封装)
- iOS 开发 AFNetworking实现网络请求,上传和下载
- iOS 开发网络数据处理 ------ AFNetWorking
- iOS网络请求---AFNetWorking教程2
- iOS第三方网络请求框架--AFNetworking
- iOS AFNetworking封装的网络请求
- iOS开发——网络请求数据处理
- 关于Maven的依赖传递
- Remote CMD to Java App
- setTimeout与setInterval区别
- Linux-Centos 安装shutter截图软件
- java中Date类详解
- iOS开发——网络请求案例汇总(AFNetworking)
- Git学习记录---------(二)
- 安装或更新gdb之前先安装texinfo
- submit和button类型控制的表单提交
- 解决Thinkpad开启飞行模式无法连接无线网络
- 添加磁盘组存储OCR数据报错
- java面相对像基础知识(四)
- Apache重写规则整理
- 基础算法 冒泡排序