使用fiddler抓包时,会发现抓到的post请求的data有些会以明文显示,有些会显示为乱码。这里介绍下如何post乱码数据给服务器,这里分两种情况:1、编码不对,所以显示为乱码;2、本身数据就是二进制数据(所以本篇标题并不是特别准确)。正常抓包到的数据如下图:

messy code of post data
messy code of post data

一、编码转换

常见的乱码数据包如下图,注意下面还有一个“ FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation ” 的提示, 这个右连将AutoTruncate的勾选去掉即可。

post data binary
post data binary

一些乱码实际是编码方式不对,是可以转码显示的,fiddler工具已经默认带有转码功能textwizard 。如下图所示,为了精确选取数据在,可以切到的hexview视图下,postdata和url及header头的颜色不同,右键选择后,选择copy并点击上面的textwizard图标,在下面的编码转换中选取对应的编码即可。

fiddler textwizard
fiddler textwizard

不过明显,本篇截图的数据不是这种,因为从post中的url 里已经说明是mobile/binary 。如果是普通的数据,转换完成后和其他post方法一样,直接post提示给服务器即可。

二、post二进制包

由于url和header头信息显示的为蓝色,postdata为黑色(fiddler做的还是很贴心的,在右边栏的数据预览区也可以看到),这里选择postdata右键save selected bytes to file ,将刚刚选择的部分保存为文件,刚刚截取的 url为高德地图里的地址位置数据。这里我保存为gps.dat 。

post hexview data
post hexview data

接下来可以使用牛X的curl 来先简单的模拟先服务器发送二进制数据文件,可以先看下curl与postdata相关的命令部分如下:

1[root@361way 06]# curl --help
2-d, --data DATA     HTTP POST data (H)
3     --data-ascii DATA  HTTP POST ASCII data (H)
4     --data-binary DATA  HTTP POST binary data (H)
5     --data-urlencode DATA  HTTP POST data url encoded (H)

具体先服务器post的指令如下:

1curl -H 'Accept-Encoding: gzip'  -H 'gzipped: 1'
2-H 'X-INFO: H4sIAAAAAAAAAAGQAW/+XtQhvCPct7zVMxyLN99W8LpeZsp+NgrIVHgOKcPysNdeSoCI+xxHUF1iAE8shjdsvDy7nyZojL4ZNIRSqxhLy7C+tx+lAh8f7mPmrNZFgnLOKl59JIhRoJt4HU8x29cKbyeK/59UgA2Fwco2682Jp/hXEGJi0KlxrCUCq5/1zQc/mxOEUlOG6dzYEgpfEfVw0HX/sIreDMVwrVvtRHjqm0aCTO8cYBA/MwSqN11xMZybP+qFQsmo0l1hiQZNrPJzCVV/15qfLDAvdZNyw3EwhB0gh+cS9qfL9/tyh4kHqi2Td1+hPdb1D3TPBnUqzUlbHuxEVE7AsF3e9d6SbkWi81uX2eT8B2exemrva6ogAJmI6d4WXMA7cfvXsGm6AMr4+KdDY8Z8ZruMTjm7Vcfl7ACpVIWgGpdyWCn/XPjjtEYVvEw9TMMgPyIYAiZiigymzPFfMbvyiUpjFsAiuEizaSyIK4ClXFYEwI1pVt99kcCFPqQmHkqqwUtURiBvHkIu3iMASOnkms6RglCrV/OQ7RhvfUGQAQAA'
3-H 'X-BIZ: {"ex":"bW9kPVBFLVVMMDAmc3Y9NC40LjImbnQ9V0lGSSZucD3kuK3lm73ogZTpgJo="}'
4-H 'KEY: 794ada43965074a9fb56e21c3497929d' -H 'enginever: 4.2'
5-H 'User-Agent: AMAP_Location_SDK_Android 1.4.0'
6-H 'ts: 1465955922810' -H 'scode: 71ca63b846f3ab98b2242293f0a86ca7'
7-H 'ec: 1' -H 'Content-Type: application/octet-stream' -H 'Connection: Keep-Alive'
8--data-binary @gps.dat  http://apilocate.amap.com/mobile/binary | gunzip

注意,这里的-H后面跟的header信息 ,@符号后面跟的是刚刚保存的gps.dat数据。特别需要注意是的管道给 gunzip 命令,由于这个请求后的回包是经过gzip压缩的,这个从header头里是可以看出的,所认返回的结果是乱码和fiddler上查看的结果xml 格式不同,加上gunzip命令后会自动执行解包动作,输出的结果会和fiddler里抓包的返回值一致。如下图:

curl post
curl post

三、写在最后

本篇关于二进制post的部分就先到这里,而且linux 的curl 工具也是相当的强大的,只不过书写时看起来不够美观而已,后面有时候会专门再理一个篇幅做urllib2、pycurl、request等python常同模块下post文件到服务器的写法。