使用AFNetworking时,如何阻止AFJSONRequestSerializer转义JSON中的斜杠/?
解决AFJSONRequestSerializer自动转义斜杠的问题
嘿,这个场景我之前开发时也碰到过!AFJSONRequestSerializer 默认会遵循 JSON 规范对特殊字符做转义处理,其中就包括把 / 转成 \/——虽然这在标准里是合法的,但有些后端服务可能对这种转义不兼容,所以我们可以通过调整序列化器的配置来解决这个问题。
针对 iOS 10+ 的最优解决方案
从 iOS 10 开始,NSJSONSerialization 新增了 NSJSONWritingWithoutEscapingSlashes 选项,专门用来禁止斜杠的自动转义。你只需要给 AFJSONRequestSerializer 设置这个选项即可:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; AFJSONRequestSerializer *jsonSerializer = [AFJSONRequestSerializer serializer]; // 设置序列化选项:不转义斜杠 jsonSerializer.writingOptions = NSJSONWritingWithoutEscapingSlashes; manager.requestSerializer = jsonSerializer;
这样配置后,你的请求体里的 URL 就会保持原样:{"key" : "http://myURL.com/},不会再出现多余的反斜杠了。
兼容 iOS 9 及以下的备选方案
如果你的项目需要支持 iOS 9 或更早版本,因为当时还没有 NSJSONWritingWithoutEscapingSlashes 这个系统选项,我们可以自定义一个请求序列化器,重写序列化逻辑做“事后补救”:
@interface CustomJSONRequestSerializer : AFJSONRequestSerializer @end @implementation CustomJSONRequestSerializer - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request withParameters:(id)parameters error:(NSError *__autoreleasing *)error { NSURLRequest *serializedRequest = [super requestBySerializingRequest:request withParameters:parameters error:error]; if (serializedRequest.HTTPBody) { // 将自动转义的\/替换回原始的/ NSString *bodyString = [[NSString alloc] initWithData:serializedRequest.HTTPBody encoding:NSUTF8StringEncoding]; bodyString = [bodyString stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"]; NSMutableURLRequest *mutableRequest = [serializedRequest mutableCopy]; mutableRequest.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; serializedRequest = mutableRequest; } return serializedRequest; } @end
然后使用这个自定义序列化器:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.requestSerializer = [CustomJSONRequestSerializer serializer];
不过要注意,这种替换方式是“事后修复”,如果你的参数里本身就有合法的 \/ 内容,可能会被误替换,所以只适合确定参数里没有这类特殊场景的情况。
另外补充一句:其实按照 JSON 标准,\/ 是合法的表示,大部分后端框架都能正确解析并还原成 /,如果后端可以调整的话,也可以考虑让后端兼容这种格式哦~
内容的提问来源于stack exchange,提问作者Thomas R
相关产品推荐
相关产品推荐

