关于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. ACM/ICPC 之 Dinic算法(POJ2112)

    Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...

  2. SpringMVC基本配置

    1 springmvc 框架 1.1  回顾mvc结构 1.2springmvc的介绍 是一个基于mvc的web层框架,使用spring的一个子项目 在使用springmvc的时候,不用单独和spri ...

  3. Angular.element和$document的使用方法分析,代替jquery

    AngularJs是不直接操作DOM的,但是在平时的开发当中,我们有的时候还是需要操作一些DOM的,如果使用原生的JS的话操作过于麻烦,所以大家一般都是使用jQuery,jQuery虽然好用,但是An ...

  4. 算法系列:FFT 002

    转载自http://blog.jobbole.com/58246/ 快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.没有正规计算机科学课程背景 ...

  5. 朴素贝叶斯算法的python实现

    朴素贝叶斯 算法优缺点 优点:在数据较少的情况下依然有效,可以处理多类别问题 缺点:对输入数据的准备方式敏感 适用数据类型:标称型数据 算法思想: 朴素贝叶斯比如我们想判断一个邮件是不是垃圾邮件,那么 ...

  6. FP-growth高效频繁项集发现

    FP-growth 算法优缺点: 优点:一般快于Apriori 缺点:实现比较困难,在某些数据上性能下降 适用数据类型:标称型数据 算法思想: FP-growth算法是用来解决频繁项集发现问题的,这个 ...

  7. 【转】c# Image获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

  8. 弹性布局flex-兼容问题

    这里弹性布局的用法就不说了 用过的都知道很方便 虽然现在弹性布局已经实现标准了 但是还是存在一些兼容问题 旧版本 (一些低版本的浏览器) display:-webkit-box; 新版本(目前的标准版 ...

  9. nodejs review-01

    lesson lesson-code 05 Run your first web server 使用curl //指定方法;显示header信息 curl -X GET -i localhost:30 ...

  10. 与IE奋战的血泪史

    IE6下font-size会撑高元素,也就是说IE6下元素的最小高度为font-size的高度(蛋疼) IE6不支持两个class 例如 .a.b,类名不支持下划线开头 通过js设置样式带下划线的样式 ...