iOS-----使用AFNetworking实现网络通信
使用AFNetworking实现网络通信
AFNetworking可以用于发送HTTP请求,接收HTTP响应,但不会缓存服务器响应,不能执行HTML页面中嵌入的JavaScript代码,
也不会对页面内容进行任何解析、处理,内置支持JSON、Plist属性文件、XML解析。
提交GET请求与提交POST请求
在需要使用AFNetworking的程序中使用“#import “AFHTTPRequestOperationManager.h””代码导入AFNetworking的头文件即可
|
使用AFNetworking发送请求、接收响应很简单,只要如下几步 |
|
1.创建AFHTTPRequestOperationManager对象 |
|
2.根据服务器响应内容的不同,为AFHTTPRequestOprationManager对象指定不同的解析器。 该对象默认的解析器要求服务器响应是JSON数据或Plist数据。 如果服务器响应数据是其他格式的,则需要手动设置响应解析器。 |
|
3.如果需要发送GET请求,调用AFHTTPRequestOperationManager对象的GET:parameters:success:failure:方法即可; 如果要发送POST请求,调用该对象的POST:parameters:success:failure:方法即可.两个方法都可指定通信成功、通信失败的代码块。 |
|
4.在success:参数指定的代码块中处理服务器响应成功的正确数据;在failure:参数指定的代码块中处理服务器响应的错误数据。 |
|
代码片段 |
/*
为了通过AFNetworking来访问被保护页面,程序同样需要使用AFNetworking来登录系统,
|
|
上面程序中应用程序委托的manager代表一个已经初始化完成的AFHTTPRequestOperationManager对象, 需要修改应用程序委托的application:didFinishLaunchingWithOptions:方法,保证在该方法中创建AFHTTPRequestOperationManager对象, 并指定服务器响应的解析器。 |
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
// 创建AFHTTPRequestOperationManager对象
self.manager = [AFHTTPRequestOperationManager manager];
// 为AFHTTPRequestOperationManager对象指定使用HTTP响应解析器
self.manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
return YES;
}
/*
创建了一个AFHTTPRequestOperationManager对象,接下来为该对象指定使用AFHTTPResponseSerializer响应解析器,
|
LoginController.m
@interface LoginController()
{
AppDelegate* appDelegate;
}
@end
@implementation LoginController
- (void)viewDidLoad
{
[super viewDidLoad];
appDelegate = [UIApplication sharedApplication].delegate;
}
- (IBAction)loginBnClicked:(id)sender
{
// 获取用户输入的用户名和密码
NSString* name = self.nameFiled.text;
NSString* pass = self.passField.text;
if(name != nil && name.length > )
{
// 使用NSDictionary封装请求参数
NSDictionary* params = @{@”name”: name , @”pass”: pass};
// 使用AFHTTPRequestOperationManager发送POST请求
[appDelegate.manager
|
处理JSON或Plist响应
AFHTTPRequestOperationManager默认就可以处理JSON或Plist响应。服务器响应数据的MIME(多用途因特网邮件扩展
(Multipurpose Internet Mail Extensions))类型是application/json、text/json(这两个代表JSON响应)、
application/x-plist(Plist响应)其中之一时,AFHTTPRequestOperationManager默认就可以处理,
无须指定服务器响应解析器。
当服务器响应数据是JSON或Plist数据,并且AFHTTPRequestOperationManager成功解析得到服务器响应时,
服务器响应数据以NSArray或NSDictionary形式返回.
|
/* 第1个UITableViewController对应的视图控制器类为AuthorsController,该视图控制器类将会向服务器发送GET请求, 服务器响应返回JSON格式数据.该视图控制器将把JSON响应转换为NSArray集合,并使用UITableView显示该NSArray集合数据. 下面是该视图控制器类的实现部分代码. */ |
AuthorsController.m
@interface AuthorsController()
{
NSArray* authors;
AppDelegate* appDelegate;
}
@end
@implementation AuthorsController
- (void)viewDidLoad
{
[super viewDidLoad];
appDelegate = [UIApplication sharedApplication].delegate;
NSString* url = @”http://192.168.1.88:8888/AFNetworkingServer/authors.json”;
// 使用AFHTTPRequestOperationManager发送GET请求
[appDelegate.manager GET:url parameters:nil
//获取服务器响应成功时激发的代码块
success:^(AFHTTPRequestOperation* operation, id responseObject)
{
// 将服务器响应的JSON数据转换为Objective-C对象,赋值给authors属性
authors = responseObject;
// 重新加载表格数据
[self.tableView reloadData];
}
// 获取服务器响应失败时激发的代码块
failure:^(AFHTTPRequestOperation *operation , NSError *error)
{
NSLog(@” 获取作者信息出现错误: %@ ”, error);
}
];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UITableViewCell* cell = (UITableViewCell*)sender;
// 获取激发跳转的单元格所在的NSIndexPath
NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];
// 获取即将跳转的目标视图控制器
BooksController* booksController = (BooksController*)segue.destinationViewController;
// 将用户选中的单元格的作者信息传给目标视图控制器
booksControlle.selectedAuthor = [authors objectAtIndex:indexPath.row]; // ①
}
// 省略UITableViewDataSources协议中的两个方法
…..
@end
/*
上面的红色字代码发送GET请求时没有指定请求参数,当服务器响应是JSON数据或Plist数据时,服务器响应将被解析成NSArray或NSDictionary对象
|
|
服务器使用JSON格式的数据,主要基于如下两个理由 |
|
JSON格式是一种跨语言(几乎所有语言都支持JSON格式)的数据交换格式,而Plist的影响面就小多了。 |
|
Plist格式的本质依然是XML,因此Plist格式的数据在网络上的传输量更大。 |
处理XML响应
当服务器响应是XML数据时,AFNetworking必须正常处理服务器响应的XML数据,此时则需要为AFHTTPRequestOperationManager显示指定使用AFXMLParserResponseSerializer响应解析器,当使用AFXMLParserResponseSerializer解析器时,服务器返回的数据是一个NSXMLParser对象----
---可通过该对象来解析得到服务器响应的数据.
当服务器响应是XML数据时,使用AFNetworking发送请求后得到的响应是NSXMLParser对象,因此此时必须为NSXMLParser指定delegate来解析服务
器响应的XML数据.
@interface AuthorsController () <NSXMLParserDelegate>
{
AppDelegate* appDelegate;
NSMutableArray* authors;
NSMutableDictionary* author;
NSString* currentTagValue;
}
@end
@implementation AuthorsController
- (void)viewDidLoad
{
[super viewDidLoad];
appDelegate = [UIApplication sharedApplication].delegate;
|
|
从上面的红色字代码不难看出,当服务器响应时XML数据时,AFNetworking发送GET请求、POST请求得到的都是NSXMLParser,程序可通过该对象来解析服务器响应的XML数据------解析服务器数据时,需要自己实现NSXMLParserDelegate协议中的方法来获取服务器响应的XML数据,这样导致编程很麻烦。上面程序中的红色字代码将NSXMLParser的delegate指定为该协议中特定的方法-----------上面程序中的最后3个红色字方法就是为解析XML数据准备的. |
上传文件
使用AFNetworking上传文件直接调用AFHTTPRequestOperationManager的POST:parameters:constructingBodyWithBlock:
success:failure:方法提交POST请求即可,该方法比发送普通POST请求的方法多了第3个参数,该参数是一个带AFMultipartFormData
形参的代码块-----可以在该代码块中通过AFMultipartFormData来封装要上传的文件。
|
AFMultipartFormData提供了如下常用方法: |
|
|
- appendPartWithFileURL:name:error: |
将指定NSURL对应文件封装成上传文件 |
|
- appendPartWithFileURL:name:fileName:mimeType:error: |
将指定NSURL对应文件封装成上传文件.该方法可指定更多选项 |
|
- appendPartWithInputStream:name:fileName:length:mimeType: |
将指定输入流中的数据封装成上传文件.该方法可指定更多选项. |
|
- appendPartWithFileData:name:fileName:mimeType: |
将指定NSData代表的数据封装成上传文件.该方法可指定更多选项. |
|
代码片段 |
|
/*
下面程序使用一个UIPickerView来显示用户想要上传的文件,当用户选中某个文件并单击”上传”按钮后,
|
|
|
该程序的关键在于红色字代码块,该代码块位于AFHTTPRequestOperationManager发送POST请求的方法中,该代码块使用AFMultipartFormData的方法 把用户选中的文件封装成上传文件,随着POST请求提交给远程服务器-----远程服务器会处理用户上传的文件. |
|
iOS-----使用AFNetworking实现网络通信的更多相关文章
- iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
转:http://www.xue5.com/Mobile/iOS/747036.html 之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决 ...
- iOS 中 AFNetworking HTTPS 的使用
由于我们公司由HTTP转HTTPS,出现了一系列问题特此记录下. 一.HTTPS 二.App Transport Security 三.iOS 中用HTTPS 注意的问题 四.使用 AFNetwork ...
- iOS开发 AFNetworking 3.0使用遇到的问题
前段时间写了一个iOS开发之AFNetworking 3.0.4使用这篇文章,是基本的用法,昨天在使用的时候又出现了几个问题,特地俩记录下,希望能帮到大家! 问题一 我是做一个获取手机验证码的功能,进 ...
- iOS分享 - AFNetworking之多图片/文件上传
在分享经验之前,先说点题外话,之前的一个项目涉及到了多图片的上传,本来以为是一个很简单的事情,却着实困扰了我好久,究其原因,一是我不够细心,二是与后台人员的交流不够充分.在此,我想将我的老师常说的一句 ...
- ios开发 AFNetworking的基本使用方法
AFNetworking的基本使用方法 什么是GET请求? 如果只是单纯的下载数据, 使用GET请求 什么是POST请求? 特点: 请求的内容不会出现在URL网址中 向服务器发送用户名和密码, 或者 ...
- iOS开发-AFNetworking参数和多文件同时上传【多文件上传】
1. 前言 在项目开发中,我们经常需要上传文件,例如:上传图片,上传各种文件,而有时也需要将参数和多个文件一起上传,不知道大家的项目中遇到了没有,我在最近的项目中,就需要这样的一个功能:同时上传参数. ...
- iOS开发 -------- AFNetworking实现简单的断点下载
一 实现如下效果 二 实现代码 // // ViewController.m // AFNetworking实现断点下载 // // Created by lovestarfish on 15/1 ...
- iOS 使用AFNetworking 设置cookie
本问题是由于多账号访问统一服务器时, 由于服务器那边接收到sessionid一样, 故无法区分账号信息. 所以需要在移动端请求的时候重新设置cookie, 步骤如下: 1. 在登录的时候, 先将 re ...
- iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)
前言 我们知道在APP开发过程中.监听手机当前的网络状态还是一个非经常常使用的方法,这里我来为大家接受一种使用AFNetWorking来监听当前的网络状态的方法:网络监听对程序开发的帮助有非常多:比方 ...
随机推荐
- wireshark 下载
https://www.wireshark.org/download/win64/
- python 分数的数学四则运算
import fractions f1 = fractions.Fraction(, ) f2 = fractions.Fraction(, ) print('{} + {} = {}'.format ...
- SQLServer中对时间和长度的处理
---关于时间处理的函数 GETDATE() DATEADD(DAY,-20,GETDATE()) CONVERT(VARCHAR(100), GETDATE(), 112) DATENAME(PAR ...
- IntelliJ IDE 开发Java GUI 入门
j主要对java 的GUI相关知识进行简单的介绍和总结,整个博客按照创建一个java GUI的顺序进行介绍,期间穿插讲解用到的java Swing的布局.控件等相关知识.本博客所进行的讲解及工程的创建 ...
- Java读写记事本文件
Java中我们也会考虑读写记事本,文件读取如下: public static void main(String[] args) { try { String path="d:\\abc.tx ...
- 雷林鹏分享:C# 正则表达式
C# 正则表达式 正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 定义正则表达式 下面列出了用于定义正则表达式的各种类 ...
- protected internal == internal
总结:在同程序集下,protected internal类型修饰的成员变量可以在基类或派生类的类内.类外访问(同程序集下protected internal和internal访问性质相同,此处保留了i ...
- php--------合并2个数字键数组的值
开发中遇到了,数组合并并去除重复这个功能,查阅资料, 找到了一个方法,分享一下. <?php /** * PHP合并2个数字键数组的值 * * @param array $arr1 * @par ...
- php-------代码加密的几种方法
代码加密,也是保护网站安全的一种方法,以下我们来介绍一下如何通过PHP的自定义函数来加密我们的PHP代码. 方法一: <?php function encode_file_contents($f ...
- The Number Games CodeForces - 980E (树, 贪心)
链接 大意: 给定$n$节点树, 求删除$k$个节点, 使得删除后还为树, 且剩余点$\sum{2^i}$尽量大 维护一个集合$S$, 每次尽量添加最大的点即可 这样的话需要支持求点到集合的最短距离, ...