前言
Afnetworking是ios开发中很常用的网络请求库。它的地址在这里
AFNetworking
遇到的问题
在使用Restful接口时,我们会大量的进行GET,POST请求。一般使用JSON格式作为数据交换的主要类型。最近在以POST方式上传大量结构类似的数据时,发现服务器接收到的格式不正确。
原始数据
{
contacts:[
{
name:'tom',age:5
},
{
name:'jack',age:15
},
....
]
}
结果服务器收到的数据,同名字段进行了合并处理,变成了类似下面的结构
这里有些遗忘了,而且可能不同的语言可能看起来也不一样,我们当时是以nodejs作为服务器的。
name:['tom','jack']
age:[5,15]
解决
查找问题时,我回忆起了在使用接口时,即使我们的参数格式是按照json格式进行的组装,但服务器收到的都是字符串类型。通过查看我们的代码,终于发现了一个存在很久的问题,那就是关于content-type的使用。
对于我们的项目而言,大部分接口都使用json数据,而我们没有对AFNetworking设置参数的content-type,那么AFNetworking会采用默认的设置application/x-www-form-urlencoded,这种方式,会导致我们的参数进行url编码,全部被转换成字符串形式。解决办法也很简单,修改默认的请求序列化器为json形式(对应的还有响应序列化器)。
AFHTTPRequestOperationManager* manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://192.168.0.106:8080"]];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
注意
把content-type修改掉,前提当然是可以方便的获取数据,因为我用groovy(java也是)当服务器,它默认的获取参数方法,并不能直接解析出参数,需要从输入流中获取。
使用例外
进行上面的修改对于大部分接口都是可以正常工作的,但有些接口要求在进行参数传递的同时,附带二进制数据,比如通过POST修改个人资料。我目前没仔细测试,暂时还是使用旧multipart/form-data