一、起因
在开发时候用AFNetworking做网络请求时出现了一个问题,"Request failed: internal server error (500)",我一开就去百度查了一下,网上很多人都说500 是服务器的问题,但后来我去问我们这边的安卓他又可以正常请求到数据,所以我怀疑可能是代码的问题。
下面这个是请求时的报错
error: Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: internal server error (500)" UserInfo={com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x17042e480> { URL: http:xxx.xxx.xxx } { status code: 500, headers {
Connection = "keep-alive";
"Content-Length" = 456;
"Content-Type" = "text/html;charset=UTF-8";
Date = "Tue, 07 Aug 2018 06:31:06 GMT";
} }, NSErrorFailingURLKey=http:xxx.xxx.xxx, com.alamofire.serialization.response.error.data=<0d0a2020 20200d0a 3c21444f 43545950 45206874 6d6c2050 55424c49 4320222d 2f2f5733 432f2f44 54442048 544d4c20 342e3031 20547261 6e736974 696f6e61 6c2f2f45 4e222022 68747470 3a2f2f77 77772e77 332e6f72 672f5452 2f68746d 6c342f6c 6f6f7365 2e647464 223e0d0a 3c68746d 6c3e0d0a 3c686561 643e0d0a 3c6d6574 61206874 74702d65 71756976 3d22436f 6e74656e 742d5479 70652220 636f6e74 656e743d 22746578 742f6874 6d6c3b20 63686172 7365743d 5554462d 38223e0d 0a3c7469 746c653e 4572726f 72353030 3c2f7469 746c653e 0d0a3c2f 68656164 3e0d0a3c 626f6479 3e0d0a09 3c62722f 3e0d0a09 3c62722f 3e0d0a09 3c62722f 3e0d0a09 093c6365 6e746572 3e0d0a09 093c7072 653e0d0a 4e6f7465 3a204465 61722075 7365722c 20796f75 20686176 65206e6f 74206c6f 67696e20 746f2074 68652073 79737465 6d2c2073 6b697020 6c6f6769 6e207061 6765206c 6f67696e 2e2e203c 62723e0d 0a3c6120 68726566 3d222e2f 6c6f6769 6e2e646f 22207461 72676574 3d225f74 6f70223e 4c6f6769 6e205061 67653c2f 613e0d0a 09093c2f 7072653e 0d0a0d0a 093c2f63 656e7465 723e0d0a 3c2f626f 64793e0d 0a3c2f68 746d6c3e>, NSLocalizedDescription=Request failed: internal server error (500)}
二、问题
经过查找,我定位到问题在序列化器上
requestSerializer
requestSerializer
是 AFNetworking
参数编码的序列化器,它把输入的参数编码后才往服务器发送,有三种编码格式:
AFHTTPRequestSerializer
:第一种是普通的http的编码格式,转成
userName=xiaoming&password=12345678&time=20180807
AFJSONRequestSerializer
:第二种也是json编码格式,会转成{"userName":"xiaoming","password":"12345678","time":"20180807"}
AFPropertyListRequestSerializer
:pislt格式
responseSerializer
是反编码的参数序列化器,主要把你接受到的数据先反编码一遍才输出
requestSerializer
和responseSerializer
根据需求来自己设置,一般你跟后台沟通,了解接口接收和输出的格式,然后设置好就可以了
三、总结
上面的那个问题报错我最后改了一下requestSerializer
就可以正常获取数据了
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
ps: 其实这一切都是后台的坑,公司有好几个后台开发,不同功能有时是不同的后台给我提供的接口,然后他们有自己的开发习惯,有些接口接收json格式返回json格式,有些接口接收普通的http的编码格式返回json格式,有些接口接收普通的http的编码格式返回Image格式,我一开始用的是统一的方法,现在要根据不同的接口一一去配置,就是坑...