想到写任何关于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的数据编码格式问题的更多相关文章

  1. Content-Type的几种常用数据编码格式

    Content-Type,内容类型,一般是指网页中存在的Content-Type,ContentType属性指定请求和响应的HTTP内容类型.如果未指定 ContentType,默认为text/htm ...

  2. Content-Type:几种常用数据编码格式

    Content-Type: 用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据. 内容类型,一般指网页中存在的Content-Type,Content-Type属性指定请 ...

  3. 160504、springmvc返回json数据编码格式设定

    <!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射 --> <bean class="org.springframework.web ...

  4. Django中数据传输编码格式、ajax发送json数据、ajax发送文件、django序列化组件、ajax结合sweetalert做二次弹窗、批量增加数据

    前后端传输数据的编码格式(contentType) 提交post请求的两种方式: form表单 ajax请求 前后端传输数据的编码格式 urlencoded formdata(form表单里的) ja ...

  5. AFN 二次封装

    #import "YQDataManager.h" #import <YYModel/YYModel.h> #pragma mark - 数据model基类 @impl ...

  6. mysql编码格式设置

    两个地方能影响到mysql的编码格式 ①.[mysql]下default-character-set=GBK//指的是客户端输入的内容的编码(GBK只是支持中英文)②.[mysqld]下# The d ...

  7. AFN 处理网络哪些事(轻松掌握AFN网络顶级框架)

    AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...

  8. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  9. IOS - AFN

    #import "ViewController.h"#import "AFNetworking.h"#import "SSZipArchive.h&q ...

随机推荐

  1. MD5-UTF8-大写加密

    private string GetMD5Hash(string str) { string md5Str = ""; byte[] buffer = Encoding.UTF8. ...

  2. OpenCV3的配置(VS2015)

    1:首先下载和解压到给定的目录 2:设置环境变量...\build\x64\vc14\bin 3:打开VS,新建一个项目,再添加一个代码,刚开始当然是报错的 #include<opencv2\o ...

  3. LeetCode 233 Number of Digit One 某一范围内的整数包含1的数量

    Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...

  4. 使用URLRewriter实现URL重写

    优点 1)隐藏真实URL,提高安全性 2)更加友好的URL,好记(看博客园就行知道啦) 3)便于搜素引擎收录 ......... 可能的缺点 使用URL重写可能导致: 1)图片路径的问题 2)CSS路 ...

  5. Java学习笔记--类和对象

    1.介绍面向对象的编程          面向对象是现在主流的编程样例,它替代了以前C语言使用时的“结构体”,Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每 ...

  6. java实现发送邮件工具

    java实现发送邮件的功能:首先需要导入mail.jar: 然后需要写发送方法: 1.邮箱发送封装工具类: package com.wxjiameng.utils; import java.util. ...

  7. IoC和AOP使用扩展。。。

    实现依赖的多种方式. 1.理解构造注入. 2.掌握使用p命名空间实现属性注入. 3.理解不同的数据类型的注入方式. 4.如何通过构造注入为业务类注入所依赖的数据访问层对象,实现保存用户数据功能. 5. ...

  8. Java 在使用@Select遇到的问题:拼接字符串将数组拼为了字符串

    Java再用@Select拼接sql语句时候, #{参数名}:是加引号的 ${参数名}:是不加引号的 例如: userIds为List或者数组,值为1,2,3,4,5 1.@Select(" ...

  9. OO 第四单元总结

    一.总结本单元两次作业的框架设计 1.1. 需求分析 通过分析mdj文件可知,两次作业如果对于时间复杂度没有要求,可以不涉及任何数据结构,直接根据读入的UML_ELEMENT逐个分析得到各个函数的结果 ...

  10. 链接文字<a>保持原有的字体颜色

    <style type="text/css"> #red {color: red;} #blue {color: blue;} #orange {color: oran ...