背景
最近在做一个校园工具,其中有个功能是查看自己校园网账户的剩余流量。学校的网络管理中心没有开放接口,于是只能利用Alamofire来模拟登录解析数据。一开始通过GET请求获取用户账户余额都是没有问题的,但是通过POST请求的话,就无法正确访问数据。
原因
之前知道该网站是GB2312编码的,于是在解析data为HTML的时候就用GB2312解码的。但在POST数据时,也需要GB2312编码。我开始时将post的string参数用GB2312编码,发现不行。于是就查看了Alamofire的源码,发现其默认的参数编码是UTF-8,而且只有这一个选择😂。
1 | if mutableURLRequest.valueForHTTPHeaderField("Content-Type") == nil { |
这样就很尴尬了。在Google搜了半天,也没找到类似的问题。于是问了我一个经常抓包的哥们,他说GB2312编码的服务器遇到的次数非常少。再加上本来用swift模拟请求的场景就不多了,难怪没同样的问题呢。试了很久,我都准备鸣金收兵了。
解决
后来问了学长这个问题,他说可以自定义Alamofire的request,在request中进行参数的GB2312编码或许可以。于是带着最后一丝希望去试了一下,发现学长真行🤗。
自定义Alamofire的request代码如下:
1 | let GB2312Encoding = CFStringConvertEncodingToNSStringEncoding(0x0632) |
调用该自定义Request的方法如下:
1 | let urlRequest = urlRequestWithComponents(SchoolNetWorkBaseURL, parameters: parameters) |
通过这个,就可以实现使用Alamofire实现GB2312编码的请求了。
番外篇:关于使用Alamofire实现gzip压缩参数的网络请求
在解决上面的问题时,我一度偏失了方向,以为是参数没有压缩的问题。下面记录一下gzip压缩的参数问题。
下面是对ParameterEncoding的扩展,Alamofire在请求的request的encoding中,选择ParameterEncoding.gzipped即可。
1 | // |