关于AFNetworking中header的bug问题
关于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问题的更多相关文章
- [Android Bug] ListView中Header, Footer无法隐藏(gone)的问题
ListView中Header.Footer View应该是会应该遇到, 比如说,滚动到底部时,自动开始加载: 对于一些应用市场,会在Header中加上ViewFlipper做应用推荐(滚动的那种,好 ...
- iOS AFNetworking中cookie的读取与设置
参考: http://blog.csdn.net/zhaoxy_thu/article/details/20532879 实际上AFNetworking中并没有专门针对cookie封装的代码,但是由于 ...
- 关于RadAsm中GetEnvironmentStrings的BUG。
今天在asm中不通过msvcrt.inc调用c库. 所以.第一时间就在vc的lib中拷贝了libc.lib问价.加入工程后. 声明.调用如下: 然后.链接报错. libc.lib(crt0.obj) ...
- IE6中的常见BUG与相应的解决办法
开发前端的同学一定都知道,IE6是兼容BUG最多的浏览器,它不支持PNG alpha通道暂且不论.其文档的解析理解规范也引起了诸多恼人的BUG,有时甚至让人感到绝望.本文主要讲解一些比较容易遇到的IE ...
- CSS中常见的BUG调试
1.布局--layout 布局是windows提出的概念,用于控制元素的尺寸和定位. 拥有布局的元素负责自身及其子元素的尺寸及定位,而没有布局的元素仅仅能依靠近期的祖先元素进行控制. 通常在IE6中出 ...
- onbeforeunload与a标签在IE中的冲突bug(转载)
onbeforeunload与a标签在IE中的冲突bug onbeforeunload 是window的一个事件,目前Firefox,IE都支持,主要用来提示用户是否真的要离开该页面,通常在一些比 ...
- IE6中CSS常见BUG全集及解决方案——摘自网友
IE6中CSS常见BUG全集及解决方案 IE6双倍边距bug 当页面内有多个连续浮动时,如本页的图标列表是采用左浮动,此时设置li的左侧margin值时,在最左侧呈现双倍情况.如外边距设置为10px, ...
- 【我的Android进阶之旅】如何去除ListView中Header View、Footer View中的分割线
最近的项目中给ListView 加入了一个Header View之后,发现Header View的下方也有了分割线,很难看,UI要求将Header View的分割器去掉,好吧.现在就来说一说如何如何去 ...
- Kali Linux 2017中Scapy运行bug解决
Kali Linux 2017中Scapy运行bug解决 Scapy是一款强大的网络数据包构建工具.在Kali Linux 2017中,当在scapy的命令行中,运行res.graph()生成图形 ...
随机推荐
- C#动态创建和动态使用程序集、类、方法、字段等
C#动态创建和动态使用程序集.类.方法.字段等 分类:技术交流 (3204) (3) 首先需要知道动态创建这些类型是使用的一些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使用反射,那么动 ...
- sql语句中----删除表数据drop、truncate和delete的用法
sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table tb --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...
- SVN上传文件提示磁盘空间不足的问题
SVN上传文件大于100M,提示:Commit failed (details follow):While preparing 'E:\AFCData\tjsc20db_table.sql' for ...
- xcode 消除警告
项目中引用大量的第三方代码时,这些代码很复杂,不要轻易去改动它,如果编译产生很多警告,该如何消除呢? 1. 最直接.最一劳永逸.最安全的方式,直接找到警告的那段代码,改为不警告.这个方式最安全. 可是 ...
- 解决java.lang.InstantiationError: sun.net.ftp.FtpClient
换用jdk1.6 .如果是放容器里的,也把容器的jdk换成1.6
- Oracle 11g RAC 卸载CRS步骤
Oracle 11g之后提供了卸载grid和database的脚本,可以卸载的比较干净,不需要手动删除crs ##########如果要卸载RAC,需要先使用dbca删除数据库,在执行下面的操作### ...
- c# 针对SAP服务通讯
对于sap完全没有概念. 不知道是什么,也不想了解过多.还是像针对一个技能好好的研究一下. 年前的一个项目遇到c#调用SAP来实现一些业务逻辑对于我这个门外汉确实有点摸不着头闹.捋顺一下思路. . 结 ...
- HDU 4605 Magic Ball Game (dfs+离线树状数组)
题意:给你一颗有根树,它的孩子要么只有两个,要么没有,且每个点都有一个权值w. 接着给你一个权值为x的球,它从更节点开始向下掉,有三种情况 x=w[now]:停在此点 x<w[now]:当有孩子 ...
- JavaScript 富文本编辑器
WEB项目中使用UEditor(富文本编辑器) UEditor - 完整示例 http://ueditor.baidu.com/website/onlinedemo.html UEditor注意事项: ...
- python 线程之 threading(二)
在http://www.cnblogs.com/someoneHan/p/6204640.html 线程一中对threading线程的开启调用做了简单的介绍 1 在线程开始之后,线程开始独立的运行直到 ...