美文网首页iOS开发
(原创)ASIHTTPRequest库 post 请求遇到的中文

(原创)ASIHTTPRequest库 post 请求遇到的中文

作者: hypercode | 来源:发表于2018-06-04 19:04 被阅读4次

    最近维护老代码时遇到了一个问题,老代码用的网络库是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的上述实现,上传到公司代码仓库,从而根本解决问题。

    相关文章

      网友评论

        本文标题:(原创)ASIHTTPRequest库 post 请求遇到的中文

        本文链接:https://www.haomeiwen.com/subject/uhwysftx.html