众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐。操作起来很不方便。不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各种序列化的操作,同时还要考虑请求数据的安全等一堆问题。

转载请注明出处:http://blog.csdn.net/xn4545945 

一、早前的几个网络框架
1、ASI框架: HTTP终结者.很牛,
但是有BUG, 已经停止更新.
2、MKNetworkKit (印度人写的).
3、AFN一直还在更新.

AFNetworking的出现:MAC/iOS设计的一套网络框架.(为了简化网络操作)

*AFN专注与网络数据传输,以及网络中多线程的处理.

二、AFNetworking的使用

1、AFN特性 :
*登录传参数时,传递字典即可.(键名为参数名,键值为参数值).
*自动到子线程中执行,执行完后返回主线程.
*返回的结果自动序列化为NSDictionary.
2、使用AFN注意 :
*AFHTTPRequestOperationManager封装了通过HTTP协议与Web应用程序进行通讯的常用方法.(这个实例化的时候不是单例,
因为没有shared字)
*包括创建请求/响应序列化/网络监控/数据安全.
*方法等都是以AF开头的.
3、AFN能做的 (网络中的都涵盖了):
*GET/POST/PUT/DELETE/HEAD请求.
*JSON数据解析/Plist数据解析.(不支持XML数据解析)
*POSTJSON.
*上传/下载.
4、使用步骤
: (可参考说明文档)
1.首先需要实例化一个请求管理器AFHTTPRequestOperationManager.
2.设置请求的数据格式:默认是二进制.(不是可改)
*AFHTTPRequestSerializer(二进制)
*AFJSONRequestSerializer(JSON)
*AFPropertyListRequestSerializer(Plist)
3.设置响应的数据格式:默认是JSON.(不是可改)
*AFHTTPResponseSerializer(二进制)
*AFJSONResponseSerializer(JSON)
*AFPropertyListResponseSerializer(Plist)
*AFXMLParserResponseSerializer(XML)
*AFImageResponseSerializer(Image)
*AFCompoundResponseSerializer(组合的)
4.如果响应者的MIMEType不正确,就要修改acceptableContentTypes.
5.调用方法,发送响应的请求(GET/POST...).

关于修改AFN源码:通常序列化时做对text/plan等的支持时,可以一劳永逸的修改源代码,在acceptableContentTypes中修改即可。

AFN进行GET、POST登录:

  1. #pragma mark - get/post登录
  2. - (void)getLogin {
  3. //1.管理器
  4. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  5. //2.设置登录参数
  6. NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };
  7. //3.请求
  8. [manager GET:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {
  9. NSLog(@"GET --> %@, %@", responseObject, [NSThread currentThread]); //自动返回主线程
  10. } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
  11. NSLog(@"%@", error);
  12. }];
  13. }
  14. /**
  15. *  和上面的GET用法完全一样, 只有一个POST参数不一样
  16. */
  17. - (void)postLogin {
  18. //1.管理器
  19. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  20. //2.设置登录参数
  21. NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };
  22. //3.请求
  23. [manager POST:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {
  24. NSLog(@"POST --> %@, %@", responseObject, [NSThread currentThread]); //自动返回主线程
  25. } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
  26. NSLog(@"%@", error);
  27. }];
  28. }

AFN进行网络数据解析,获取Plist,JSON,XMLAFN不支持自动解析XML,有专门的框架去做,如SAX,PULL,KissXML等)

  1. #pragma mark - get 数据解析
  2. - (void)getJSON {
  3. //1.请求管理器
  4. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  5. //2.发起请求
  6. [manager GET:@"http://localhost/videos.json" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {
  7. NSLog(@"%@", responseObject);
  8. } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
  9. NSLog(@"%@", error);
  10. }];
  11. }
  12. /**
  13. *  不支持XML数据解析
  14. */
  15. - (void)getXML {
  16. //1.管理器
  17. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  18. //2.设置返回数据类型
  19. manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; //先实例化一下
  20. //3.发起请求
  21. [manager GET:@"http://localhost/videos.xml" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {
  22. NSLog(@"%@", responseObject);
  23. } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
  24. NSLog(@"%@", error);
  25. }];
  26. }
  27. - (void)getPlist {
  28. //1.管理器
  29. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  30. //2.设置response类型
  31. manager.responseSerializer = [AFPropertyListResponseSerializer serializer]; //是Response, 别写成request了. 修改为plist类型.
  32. manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; //这个可以直接往框架里面修改.
  33. //3.请求
  34. [manager GET:@"http://localhost/videos.plist" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {
  35. NSLog(@"%@", responseObject);
  36. } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
  37. NSLog(@"%@", error);
  38. }];
  39. }

用AFN来POST JSON数据,上传、下载等。(上传、下载主页说明上有https://github.com/AFNetworking/AFNetworking

    1. #pragma mark - post json数据与上传文件等
    2. - (void)postJSON {
    3. //1.管理器
    4. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    5. //2.设定类型. (这里要设置request-response的类型)
    6. manager.requestSerializer = [AFJSONRequestSerializer serializer];
    7. manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //这个决定了下面responseObject返回的类型
    8. //    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    9. //  manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
    10. //2.设置登录参数
    11. NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };
    12. //3.发送请求
    13. [manager POST:@"http://localhost/postjson.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {
    14. //      NSLog(@"postjson--> %@", responseObject);  //这样显示JSON的话需要设置text/plain
    15. NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    16. NSLog(@"%@",result);
    17. } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
    18. NSLog(@"%@", error);
    19. }];
    20. }

iOS开发之AFNetworking网络编程的更多相关文章

  1. iOS开发之AFNetworking 3.0.4使用

    昨天使用Cocoapods导入AFN做POST的时候,导入的最新版的3.0.4,突然发现找不到AFHTTPRequestOperationManager了...上github上一看,发现没有这个了.刚 ...

  2. iOS开发之AFNetworking 3.0.4使用-OC

      GET请求 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:URL parameters: ...

  3. iOS开发之AFNetworking实现数据传输和文件上传

    //传输数据 1 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.r ...

  4. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  5. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

  6. iOS开发之MVVM在项目中的应用

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  7. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  8. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

  9. iOS 开发之Block

    iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1.     按钮事件 target action 机制. 它是将一 ...

随机推荐

  1. Struts2_day04--课程介绍_Struts2拦截器概述&底层原理_重要的概念

    Struts2_day04 上节内容 今天内容 Struts2拦截器概述 拦截器底层原理 重要的概念 自定义拦截器 自定义登录拦截器 Struts2的标签库 Struts2表单标签(会用) Strut ...

  2. 应用开发之WinForm环境

    本章简言 上一章笔者讲到关于IO文件操作类,了解如何处理文件流.从这一章开始笔者将讲解相对比较高级的知识点.而本章笔者就对WinForm开发的知识点进行讲解和引导.现在很多业务都是面向于B/S模式的开 ...

  3. js(jQuery)相关随笔

    //获取所有name='id'.被选择的的多选框var idArr = $("input[type='checkbox'][name='id']:checked");//将这些多选 ...

  4. Android之检查网络是否可用(跳转网络设置页面)

    private boolean NetWorkStatus() { ConnectivityManager cwjManager = (ConnectivityManager) getSystemSe ...

  5. Git详解之二 Git细节拾遗

    git知识点详解 文件状态 现在我们手上已经有了一个真实项目的 Git 仓库,并从这个仓库中取出了所有文件的工作拷贝.接下来,对这些文件作些修改,在完成了一个阶段的目标之后,提交本次更新到仓库. 请记 ...

  6. 【黑金原创教程】【Modelsim】【第六章】结束就是开始

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  7. Jquery 中 .trigger 的用法

    项目中有个需求,数据加载完成后,默认模拟点击某个元素节点(选中某个元素节点)并触发事件 $('.course_list dd').on('click', function () {     //取当前 ...

  8. IDEA安装Python环境,并加入Anaconda环境

    为什么做这个事情? 1.首先,Anaconda中已经有各种科学计算环境,包括后面安装的tensorflow 2.通过IDEA中配置就达到了Scala.Python.Java同时运行的目的. Intel ...

  9. Servlet------>jsp自定义标签5(标签体内容改为大写)

    5.把标签体内容改为大写(tld中的配置我就省略了,详细请看jsp自定义标签1) import java.io.IOException; import javax.servlet.jsp.JspExc ...

  10. 伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)

    目录 堆溢出点 伪造空闲堆块 释放时重写指向伪造堆块的指针 如何利用 参考资料 堆溢出点 图1           堆溢出点 在edit函数中,没有对输入的长度和原来的长度做判断. 伪造空闲堆块 正常 ...