AFN post的数据编码格式问题
想到写任何关于AFN的东西其实我是拒绝的,因为自己这也是第一次用,毕竟AFN现在是最为流行的网络框架了,害怕自己理解的有误,所以不敢造次!
先在这里大致讲解一下过程吧,后期发现了再更正(主要是想让看官避免遇到同类的问题),可能原理说得并不正确,所以希望大家直接看解决办法
在这次使用的过程中,就遇到了编码格式问题,后来经过抓包(自己客户端还没用过charles,说起来也是惭愧,这篇博客后就要滚去学习一下了),发现是自己客户端的编码格式的问题
具体什么问题,我下面说:
key point:
大家都知道AFN默认post接受的参数是id类型的,而且他内部已经实现了参数的编码,仅仅是对参数,如果将url整体传入的话需要自己编码
如果你穿的是nsmutabledictionary的话就不需要自己编码,他内部已经帮你处理好了!
问题其实就是出在这里
后台(接口文档)要求我们传的格式是类似于:
tartdate=2015-01-01&enddate=2015-11-01&crdNo=6210888100208023&identityNo=510703198901062430&pageNum=1&trcode=20003&channelflag=1
这种格式的post参数(真是*了dog了),而且加密方式是也很奇葩,而且而且他返回回来的是json,发过去的不是,也是奇葩!这里就不说了
- 一.没办法,我就只能把以前的nsdictionary改成nsstring
见下图(我简单的封装的AFN):

后来那边服务器打开过后,我们进行对接,发现总是返回我们数据签名不合法!
但是我和安卓组检查了加密方式和最终的加密结果进行一一比对也还是没有发现问题,于是大boss(不是搞iOS的)就说他看一看,最后他也说没发现加密有什么问题(安卓组已经通了),
- 二.于是怀疑是不是post的编码格式有问题,原先我发送请求的代码如下:

- 三.后来尝试更改为:

也还是报错,于是网上爬文,也尝试了设置其他的一些请求头,还是没有效果
于是大boss说只有抓包才能看出问题!抓包就抓包吧,但是抓出来的结果和安卓组的一样!
咦!不对,post出去的数据不对啊(抱歉,当时没有截图),你传出去的编码格式不对啊,
本来应该类似于:
tartdate=2015-01-01&enddate=2015-11-01&crdNo=6210888100208023&identityNo=510703198901062430&pageNum=1&trcode=20003&channelflag=1
&sigh=********** 这种格式的
但是实际上是(网上随便测试的):
https://www.google.co.jp/?gfe_rd=cr&ei=ey9lVsLPJcfD8Aev6a74Bw&gws_rd=ssl#q=%E4%BD%A0%E5%A5%BD++%E4%B8%AD%E5%9B%BD
四.就是说传出去的时候AFN自动把&给我们进行url编码了,但是实际上我们是不需要他给我们进行编码的
所以又爬文,又是试方法,发现还是没用!于是大boss就说他也不知道为什么了,按常理这么成熟的框架应该会有这方面的解决方案的啊,他就叫我再看看,如果还是不行,就叫我换ASI
OMG,老大,这不是开玩笑的吧,换框架你知道有多痛苦?而且基本上我这个都写好了,现在叫我改,岂不是要我命? 而且你还说第二天要发布测试版(发布个*啊)!
我实在是不想改框架,于是就拿安卓代码来看,最后发现他们竟然是用的map(就是oc的字典),不是说好的不是字典,是字符串吗? 你们原来不是拼接的post参数嘛?
什么时候改的,为什么不告诉我你们换了,你们还就在我的座位旁边啊啊啊啊啊啊…
好吧,崩溃心情可想而知
五.于是我就做了最后的尝试,把接受参数换成NSDictionary

六.传过去的格式:

然后就TM成功了!
我想说明的其实就是上面那句话:
AFN内部已经实现了参数的编码,仅仅是对参数,如果将url整体传入的话需要自己编码
如果你传的是NSMutableDictionary的话就不需要自己编码,他内部已经帮你处理好了!
希望大家不要遇见这种问题!
转载请注明出处,谢谢!
AFN post的数据编码格式问题的更多相关文章
- Content-Type的几种常用数据编码格式
Content-Type,内容类型,一般是指网页中存在的Content-Type,ContentType属性指定请求和响应的HTTP内容类型.如果未指定 ContentType,默认为text/htm ...
- Content-Type:几种常用数据编码格式
Content-Type: 用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据. 内容类型,一般指网页中存在的Content-Type,Content-Type属性指定请 ...
- 160504、springmvc返回json数据编码格式设定
<!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射 --> <bean class="org.springframework.web ...
- Django中数据传输编码格式、ajax发送json数据、ajax发送文件、django序列化组件、ajax结合sweetalert做二次弹窗、批量增加数据
前后端传输数据的编码格式(contentType) 提交post请求的两种方式: form表单 ajax请求 前后端传输数据的编码格式 urlencoded formdata(form表单里的) ja ...
- AFN 二次封装
#import "YQDataManager.h" #import <YYModel/YYModel.h> #pragma mark - 数据model基类 @impl ...
- mysql编码格式设置
两个地方能影响到mysql的编码格式 ①.[mysql]下default-character-set=GBK//指的是客户端输入的内容的编码(GBK只是支持中英文)②.[mysqld]下# The d ...
- AFN 处理网络哪些事(轻松掌握AFN网络顶级框架)
AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...
- iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充
一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...
- IOS - AFN
#import "ViewController.h"#import "AFNetworking.h"#import "SSZipArchive.h&q ...
随机推荐
- Java基础笔记(十二)——方法
方法:实现一个功能. 方法声明: 访问修饰符 返回类型 方法名(参数列表){ //方法体 } 访问修饰符:public.private.protect.default 返回类型:void——无返 ...
- iOS无线真机调试
打开xcode,选择Window > Devices and Simulators 用数据线连接设备 选择 Connect via network
- 020 Valid Parentheses 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.括号必须以正确的顺序关闭,"()" 和 "()[]{}" 是有效的 ...
- (转)认识 Linux 文件系统
7.1 认识 Linux 文件系统 原文:https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/59.html Linux 最传统 ...
- ajax无刷新评论示例
下面就为大家带来一篇 ajax无刷新评论示例.学习还是有点帮助的,给大家做个参考吧. 这是留言板的界面,当用户点击提交留言的时候,自动提交到我的留言下面 留言内容中为空,或者为灰色的“没有填写留言内容 ...
- 工作经验(JNI篇)
我的工作是C++开发,主要是做底层的,由于要做跨平台的原因,常会做成JNI给Java调用,下面是工作时总结的经验希望有用 JNI只能使用C语言的方式编译,所以,要使用C++的话,要用 extern & ...
- File 元素 都有files属性
File 元素 都有files属性 必须有 name 才能传到后台 Html data-* 存储string 值 Jquery data() 可以存储对象 ,但是执行后页面看不到,可以取到 P ...
- webpack.config.js====配置babel
参考:https://www.jianshu.com/p/9808f550c6a91. 安装依赖babel-loader: 负责 es6 语法转化babel-preset-env: 包含 es6.7 ...
- 面向对象设计与构造:JML规格单元作业总结
面向对象设计与构造:JML规格单元作业总结 第一部分:JML语言理论基础 JML语言是什么:对Java程序进行规格化设计的一种表示语言 使用JML语言有什么好处: 用逻辑严格的规格取代自然语言,照顾马 ...
- javascript中call()、apply()、bind()的用法理解
一.bind的用法 第一个:obj.showInfo('arg','arg_18');中传的2个参数通过showInfo方法改变的是obj下中的name和age 第二个:obj.showInfo.bi ...