关于AFNetworking中header的bug问题

[摘要:AFNetworking那个正在ios开辟中便未几道了,网上一搜一大推,然则详细用法我便没有道了,偶然间我会整顿一下详细的一些用法。本日首要接头一下我正在应用傍边闭于header上里的一些bug问]

AFNetworking这个在ios开发中就不多说了,网上一搜一大推,但是具体用法我就不说了,有时间我会整理一下具体的一些用法。今天主要讨论一下我在使用当中关于header上面的一些bug问题。 
首先关于一个登录保持,我和服务器人员通过具体的开发交流,决定用token作为唯一的标示,也就是当你每次登陆之后,服务器会返回给你一个token,然后我就可以保存这个token,通过设置header头部添加token换取我需要的一些数据。 
说起来简单,开始做。 
首先,我在一个报表功能页面需要通过token获取数据,参数没有,于是我在header头部添加token代码如下

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *token=[defaults objectForKey:@"token"];
NSLog(@"%@",token);
NSMutableDictionary *parameters=[NSMutableDictionary dictionary];
AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager];
// [mager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
//往头部添加token信息
[mager.requestSerializer setValue:token forHTTPHeaderField:@"token"];
mager.responseSerializer = [AFJSONResponseSerializer serializer];
mager.requestSerializer=[AFJSONRequestSerializer serializer];
NSLog(@"%@",mager.requestSerializer.HTTPRequestHeaders);
[mager GET:@"http://192.168.0.203:5000/report/1?m=d" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
}];

这里说一下下面几个设置 
1。

[mager.requestSerializer setValue:@"" forHTTPHeaderField:@""];

这个方法就是忘header头里面添加key_value键值对,也就是向头部添加信息,这个可以根据服务器要求来加入header。有很多人在做http请求时(注意https和http的安全性区别),往往把请求数据时需要的唯一标示放在afn的body里面,其实这样远没有放在header里面安全。下面我来举出两个例子: 
首先这个是把token放在body里面

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *token=[defaults objectForKey:@"token"];
NSMutableDictionary *parameters=[NSMutableDictionary dictionary];
//token放在parameters中
parameters[@"token"]=token;
AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager];
mager.responseSerializer = [AFJSONResponseSerializer serializer];
mager.requestSerializer=[AFJSONRequestSerializer serializer];
[mager GET:@"http://192.168.0.203:5000/report/1?m=d" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
}];

这个是把token放在header里面

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *token=[defaults objectForKey:@"token"];
NSMutableDictionary *parameters=[NSMutableDictionary dictionary];
AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager];
//token放在header里面
[mager.requestSerializer setValue:token forHTTPHeaderField:@"token"];
//打印一下header里面的信息
NSLog(@"%@",mager.requestSerializer.HTTPRequestHeaders);
mager.responseSerializer = [AFJSONResponseSerializer serializer];
mager.requestSerializer=[AFJSONRequestSerializer serializer];
[mager GET:@"http://192.168.0.203:5000/report/1?m=d" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
}];

下面几个代码作为了解,补充一下

//这句是告诉afn,我接受的服务器传来的是一个josn数据,然后afn会自动给我们转为字典,是不是很方便?
mager.responseSerializer = [AFJSONResponseSerializer serializer];
//申明请求的数据是json类型,这里如果进行了申明,那么我们传入的字典parameters会自动被afn转换为josn类型传给服务器
mager.requestSerializer=[AFJSONRequestSerializer serializer];
//下面这句话的意思是 告诉AFN千万别解析, 我给的是什么数据就是什么数据
mager.requestSerializer=[AFHTTPRequestSerializer serializer];
//下面这句话的意思是 告诉AFN千万别解析, 只需要给我裸数据就可以
mager.responseSerializer = [AFHTTPResponseSerializer serializer];
//这句告诉afn,如果服务器返回数据没有找到我告诉的类型,比如josn,那么就给我text活着html类型
mager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

接下来,我们用header头来包装token向服务器获取数据,代码如下

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *token=[defaults objectForKey:@"token"];
NSMutableDictionary *parameters=[NSMutableDictionary dictionary];
AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager];
[mager.requestSerializer setValue:token forHTTPHeaderField:@"token"];
mager.responseSerializer = [AFJSONResponseSerializer serializer];
mager.requestSerializer=[AFJSONRequestSerializer serializer];
NSLog(@"%@",mager.requestSerializer.HTTPRequestHeaders);
[mager GET:@"http://192.168.0.203:5000/report/1?m=d" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
}];

结果,服务器接受不到header里面的token,怎么回事?于是我各种调试,最后发现了问题。原来只要隐藏mager.requestSerializer=[AFJSONRequestSerializer serializer];这句就行了,既然没有在body里面传任何参数,就先注释这句,结果ok了!那么问题解除了吗?没有!因为第二天就发现问题了!

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *token=[defaults objectForKey:@"token"];
NSMutableDictionary *parameters=[NSMutableDictionary dictionary];
parameters[@"logout"]=@"1";
AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager];
[mager.requestSerializer setValue:token forHTTPHeaderField:@"token"];
mager.responseSerializer = [AFJSONResponseSerializer serializer];
//mager.requestSerializer=[AFJSONRequestSerializer serializer];
NSLog(@"%@",mager.requestSerializer.HTTPRequestHeaders);
[mager GET:@"http://192.168.0.203:5000/report/1?m=d" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
}];

这时,服务器需要一个header头的token,和一个参数logout,而我注释了mager.requestSerializer=[AFJSONRequestSerializer serializer];这句代码,服务器根本就接收到的参数不是json类型,哎呀,这可怎么办!打开这句注释把,能接受josn参数但找不到header头的token,不打开吧,找到header头重的token了但参数parameters里面的类型不对,不是josn了!那试一下自己转为json类型的字符串,不让afn转了吧!结果我就下了一个jsonkit自己转,结果还是不行,服务器接受的就不是josn数据,不是json数据,那么就不返回数据了!这下可难倒我了!设置header头和mager.requestSerializer=[AFJSONRequestSerializer serializer];这句代码冲突?不可能啊!于是我开始各种百度,论坛,博客,然而,中国的复制能力真的不得不叫一个牛,千篇一律。连字体都不带改的,找不到了没办法。于是服务器人员也帮忙找,他去一个外国博客上面,看了半天,突然告诉我,你换一下顺序试试?顺序?不可能吧,开什么玩笑。他说你试试吗?反正也没招了 ,试试就试试呗!

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *token=[defaults objectForKey:@"token"];
NSMutableDictionary *parameters=[NSMutableDictionary dictionary];
parameters[@"logout"]=@"1";
AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager];
//先写着两行
mager.responseSerializer = [AFJSONResponseSerializer serializer];
mager.requestSerializer=[AFJSONRequestSerializer serializer];
//在设置header头
[mager.requestSerializer setValue:token forHTTPHeaderField:@"token"];
//打印一下header信息
NSLog(@"%@",mager.requestSerializer.HTTPRequestHeaders);
[mager GET:@"http://192.168.0.203:5000/report/1?m=d" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
}];

结果,运行!ok!没问题了,josn照常接受,header头也照常接收。此时,心中一万只“草泥马”奔过,这是在逗我么!于是我又换换顺序试了几遍,嗯!确实应该先把 mager.responseSerializer = [AFJSONResponseSerializer serializer] ; mager.requestSerializer=[AFJSONRequestSerializer serializer];这两行代码写在设置header头前面就可以了!哎!问题终于解决了,在这里我把那个外国博客网站发一下,里面一大堆英文,我水平不好,真看不懂! 
https://www.parse.com/questions/using-afnetworking-with-parse-rest-api-for-post 
好了,记录完这个bug,终于可以好好写会代码了!

关于AFNetworking中header的bug问题的更多相关文章

  1. [Android Bug] ListView中Header, Footer无法隐藏(gone)的问题

    ListView中Header.Footer View应该是会应该遇到, 比如说,滚动到底部时,自动开始加载: 对于一些应用市场,会在Header中加上ViewFlipper做应用推荐(滚动的那种,好 ...

  2. iOS AFNetworking中cookie的读取与设置

    参考: http://blog.csdn.net/zhaoxy_thu/article/details/20532879 实际上AFNetworking中并没有专门针对cookie封装的代码,但是由于 ...

  3. 关于RadAsm中GetEnvironmentStrings的BUG。

    今天在asm中不通过msvcrt.inc调用c库. 所以.第一时间就在vc的lib中拷贝了libc.lib问价.加入工程后. 声明.调用如下: 然后.链接报错. libc.lib(crt0.obj) ...

  4. IE6中的常见BUG与相应的解决办法

    开发前端的同学一定都知道,IE6是兼容BUG最多的浏览器,它不支持PNG alpha通道暂且不论.其文档的解析理解规范也引起了诸多恼人的BUG,有时甚至让人感到绝望.本文主要讲解一些比较容易遇到的IE ...

  5. CSS中常见的BUG调试

    1.布局--layout 布局是windows提出的概念,用于控制元素的尺寸和定位. 拥有布局的元素负责自身及其子元素的尺寸及定位,而没有布局的元素仅仅能依靠近期的祖先元素进行控制. 通常在IE6中出 ...

  6. onbeforeunload与a标签在IE中的冲突bug(转载)

    onbeforeunload与a标签在IE中的冲突bug   onbeforeunload 是window的一个事件,目前Firefox,IE都支持,主要用来提示用户是否真的要离开该页面,通常在一些比 ...

  7. IE6中CSS常见BUG全集及解决方案——摘自网友

    IE6中CSS常见BUG全集及解决方案 IE6双倍边距bug 当页面内有多个连续浮动时,如本页的图标列表是采用左浮动,此时设置li的左侧margin值时,在最左侧呈现双倍情况.如外边距设置为10px, ...

  8. 【我的Android进阶之旅】如何去除ListView中Header View、Footer View中的分割线

    最近的项目中给ListView 加入了一个Header View之后,发现Header View的下方也有了分割线,很难看,UI要求将Header View的分割器去掉,好吧.现在就来说一说如何如何去 ...

  9. Kali Linux 2017中Scapy运行bug解决

    Kali Linux 2017中Scapy运行bug解决   Scapy是一款强大的网络数据包构建工具.在Kali Linux 2017中,当在scapy的命令行中,运行res.graph()生成图形 ...

随机推荐

  1. Javascript 执行环境及作用域

    执行环境是javascript中最为重要的一个概念. 执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象(variable object),环境 ...

  2. iOS9 新功能:Support Universal Links

    先看官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalL ...

  3. selenium常用的js总结

    1. 对input执行输入 直接设置value属性, 此方法主要应对输入框自动补全以及readonly属性的element,sendkeys不稳定 比如: //inputbox is a WebEle ...

  4. MySQL源码分析:源码文件结构及主要数据结构

    原文地址:http://blog.itpub.net/30186219/viewspace-1481125/BUILD: 内含在各个平台.各种编译器下进行编译的脚本.如compile-pentium- ...

  5. 火狐min-height不兼容解决方法

    我们在进行页面架构的时候,一般会分成三个section:header.body.footer.如下面这个页面: 这个时候我们就需要对body部分进行最小高度设置,才能避免footer部分出现在页面中间 ...

  6. Client病毒已感染超7万人 暗扣费并频弹广告

    恶意木马病毒横行,您的钱包还hold得住吗?猎豹移动安全实验室与安天AVL移动安全团队于2015年下半年,共同截获一款名为Client的木马病毒,并且对该病毒进行持续监测.通过进一步关注,我们发现该病 ...

  7. 如何使用Python在Kaggle竞赛中成为Top15

    如何使用Python在Kaggle竞赛中成为Top15 Kaggle比赛是一个学习数据科学和投资时间的非常的方式,我自己通过Kaggle学习到了很多数据科学的概念和思想,在我学习编程之后的几个月就开始 ...

  8. 微软的R语言发行版本MRO及开发工具RTVS

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软在收购R语言的开发商后,也独立发行或在自己的产品中集成了R语言,这里就介绍下它们包 ...

  9. POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次

    Milk Patterns   Description Farmer John has noticed that the quality of milk given by his cows varie ...

  10. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...