最近维护老代码时遇到了一个问题,老代码用的网络库是ASIHTTPRequest的。发 post 请求时,中文参数发过去正常情况下服务器可以解析到。(其实服务器能处理的默认就是 utf-8的),但是 公司的Android端 和 web 请求模拟工具传过去的解析不出来中文,必须将 iso-8859-1转为 uft-8才可以。但是这么转一下后 iOS 端中文又解析错误了。折腾半天最终发现原因所在:
1.所有 客户端发出的 request boby 编码格式都是 utf-8没问题。
2.Android端和web 请求模拟工具发出的 post 请求的 request header 里都没有设置charset=utf-8。但是端与服务器的中间步骤把header 没有指定字符集的请求都做了 iso-8859-1编码。
3.iOS 的ASIHTTPRequest库设置了请求header的字符集charset=utf-8,所以端与服务器的中间步骤识别到了 utf-8,所以没有做 iso-8859-1编码。所以服务器不用转码可以直接识别。(AFNetworking库也没有设置charset=utf-8)
由以上三点可知:ASIHTTPRequest库的请求头里也不指定字符集,和现在主流库保持一致即可。这样服务端要加一步,将 ios8898-1转为 uft-8。虽然服务端增加了操作,但是为了与主流库保持一致,还是这么做了。
具体做法:
将ASIFormDataRequest.m里的
[self addRequestHeader:@"Content-Type" value:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@",charset]];
修改为[self addRequestHeader:@"Content-Type" value:[NSString stringWithFormat:@"application/x-www-form-urlencoded;"]];
注意:直接这么改可以用。但是修改这个文件的标准做法不是直接改,因为这个库一般都是 Pods 管理的,本地修改只有自己这边可用,别人无法通过 Pods 更新拿到你的修改,这不利于后期维护。
标准改法是:我们要在工程里新建一个类,用方法混合的方式替换掉方法- (void)buildURLEncodedPostBody的上述实现,上传到公司代码仓库,从而根本解决问题。
网友评论