post请求
背景
移动端开发少不了和网络打交道,NSURLSession、NSURLSessionTask、NSURLRequest等概念的基础自然是必不可少。今天来聊一下一个常见的问题 : 数据分析师说 :你上传的数据不对, 你拿着OC代码告诉他我上传的是***类型的数据,数据分析师显然不懂,他有的只有一条网络请求, 总得以他懂的方式告诉他你是对的吧。 这就要引出今天的话题:如何查看网络请求的参数。
基础分析
请求常见的有两种GET和POST:
GET请求
例子:
https://a.com/b?c=d&e=f
这个请求中协议部分为https:,表示用的是HTTPS协议,域名部分是a.com,虚拟目录部分是:/,文件名部分是b,参数部分是c=d&e=f
这代表我们传了一个名称是c,值是d的参数和名称是e,值是f的参数。
POST请求
例子:
https://a.com/b?data=ABCD23465JTuz7jdG
和GET请求类似我们可以看到我们上传了一个名为data值为某个字符串的参数
那这个是什么呢? 我初看到也是一脸懵,好在有大佬给我指了一条路:这就是raw格式上传的一个数据
重点:
那既然是raw,我们就可以将它当作一个String
但是这个String自己也看不懂啊,怎办呢?我们来了解一下通常的HTTP的数据加工过程
HTTP数据加工过程:
首先假设我们有一个密码是 1···(100个),没错就是这么厉害的密码:100位长,我们想传给服务器,那么我们自然有两个想法:
1.这个数据太长了
2.我们不想让别人知道我们传给对方的是什么
怎么办呢:
太长可以压缩,不想让别人知道可以加密
通过一系列的操作之后假设我们可以得到一个满意的结果 这个结果是
1@&%¥#!满意。但是一上传就会发现:报错了。@并不能出现在密码中。
那我们自然就会想到把@值替换成别的符号。(替换成别的符号最多两次就可以保证没有不合规范的符号)。
于是我们可以得到整个数据的加工流程大概是这样:
1.压缩数据
2.加密内容
3.替换符号
知道了HTTP的加工流程了,我们回到如何分析我们这个ABCD23465JTuz7jdG 不可读的数据
参数转化
首先加工和转化必然是一个可逆的过程,否则双方就无法进行数据交换。
那么我们的第一步就是将数据进行符号反替换
1.符号反替换
iOS中对数据进行替换的一种方式叫百分比编码
通过调用这个函数:stringByAddingPercentEncodingWithAllowedCharacters: 可以实现符号的百分比编码替换
而对应的反替换我们可以通过如下函数stringByRemovingPercentEncoding来实现。
2.解密内容
首先我们应该知道我们加密的方式然后使用对应的加密方式来获得解密的数据
例如我们可以使用 Data(base64Encoded: someEncodingString) 来获得一个data类型的数据
3.数据解压缩
iOS里的压缩可以通过zlib的压缩来实现。通过deflateInit() 或者 deflateInit2() 函数 这就又会用 C 结构体 z_stream来创建对应的数据
对应的使用方法和解压缩方法可以参见其它优秀教程
解压缩得到的一般是一个NSData类型的数据。这个时候就是各种数据类型之间的转换了,大家也都明白了。随便转换个JSON格式的。就可以解释给其他人了。
结语:
网络请求的分析就像是个自然而然的过程,想必设计者们也是一步一步遇到问题之后解决才有了今天的格式。我们分析也一步一步来就好了。