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来监听当前的网络状态的方法:网络监听对程序开发的帮助有非常多:比方 ...
随机推荐
- python flask demo
from flask import Flask, jsonify from flask import abort from flask import make_response from flask ...
- django 数据库同步
python manage.py makemigrations python manage.py migrate
- 原始的生成对抗网络GAN
论文地址:https://arxiv.org/pdf/1406.2661.pdf 1.简介: GAN的两个模型 判别模型:就是图中右半部分的网络,直观来看就是一个简单的神经网络结构,输入就是一副图像, ...
- Qt与FFmpeg联合开发指南(四)——编码(2):完善功能和基础封装
上一章我用一个demo函数演示了基于Qt的音视频采集到编码的完整流程,最后经过测试我们也发现了代码中存在的问题.本章我们就先处理几个遗留问题,再对代码进行完善,最后把编码功能做基础封装. 一.遗留问题 ...
- Codeforces 352B - Jeff and Periods
352B - Jeff and Periods 思路:水题,考验实现(implementation)能力,来一波vector[允悲]. 代码: #include<bits/stdc++.h> ...
- [Java学习] Java字符串(String)
从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串: String stringName = ...
- 表达谱(DGE)测序与转录组测序的差别
DGE-seq和普通的transcriptomic profiling相比较有什么不同,有什么特点? DGE就是用酶将mRNA切断,只使用靠近poly A的一小段RNA去测序. #1 由于不是测定mR ...
- bzoj2242: [SDOI2011]计算器 BSGS+exgcd
你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...
- poj3080kmp或者暴力
The Genographic Project is a research partnership between IBM and The National Geographic Society th ...
- python-day9-数据类型总结
数据类型总结: 常用: 数字 字符串 列表 元组 字典 不常用:集合 1.按照存值个数: 1个:数字,字符串 多个:列表,元组,字典,(集合) 2.按照可变不可变: 可变:列表,字典,(集合) 不可 ...