需求
在我们的请求的时候需要上传一个设备信息信息,比如IDFA/IDFV等等信息。
做法
我首先创建一个字典,字典包含一个一个的键值对,然后将字段转成了JSON字符串:
NSError *parseError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&parseError];
NSString *jsonString = [[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] autorelease];
然后创建一个NSMutableRequest,然后设置header:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setValue: jsonString forHTTPHeaderField:@"device_info"];
然后请求上传之后无法获取到header关于此key"device_info"的信息,百度和谷歌了很久,后面经过一个一个排查,发现是这个json串直接上传上去的话是设置不了的,因为里面包含了很多的转义符,还有双引号等等,然后最后想的是将jsonString再经过一层UTF-8编码:
NSString *newNewString = [jsonString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
然后上传此新的字符串,结果抓包发现头部是有值的,但是后台那边拿不到那个值,后来发现是设置header的key不能包含下划线,比如“Content-Type”也是中划线,所以我"device_info"改成了"device-info",然后就OK,解决问题了...
注意:
UTF-8编码需要注意版本控制,那个方法是在iOS9.0就过期的,但是过期还是能用,只是有警告,具体的新接口请查看API。