AFNetworking base64 参数,字符被 NSJSONSerialization 转义
Posted
技术标签:
【中文标题】AFNetworking base64 参数,字符被 NSJSONSerialization 转义【英文标题】:AFNetworking base64 parameter, characters being escaped by NSJSONSerialization 【发布时间】:2013-02-06 08:46:44 【问题描述】:我正在尝试使用 AFNetworking 将图像提交给 CardShark's API。
NSData *imageData = UIImageJPEGRepresentation(cardImage, 1.0);
NSDictionary *parameters = @@"front" : [imageData base64EncodedStringWithSeparateLines:NO];
NSString *path = [NSString stringWithFormat:@"cardShark?webhookUrl=%@&apiKey=%@", kCardSharkWebHookURLEncodedString, kCardSharkAPIKey];
[self postPath:path parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject)
completion(responseObject, nil);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
completion(nil, error);
];
我已经尝试了 base64 字符串的所有组合。
base64EncodedStringWithSeparateLines:YES
base64EncodedStringWithSeparateLines:NO
base64EncodedString`
无济于事,在检查了生成的请求上的HTTPBody
之后,我看到事情正在被转义。
原始 base64 以
开头/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAAB
AAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAEOKAD
AAQAAAABAAACrAAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
但是一旦它通过了 AFNetworking 并且大概是 NSJSONSerialization 它就会被发布为
\/9j\/4AAQSkZJRgABAQAAAQABAAD\/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAEOKADAAQAAAABAAACrAAAAAD\/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH\/
如您所见,/
正在被转义。如何防止逃跑?通过另一个工具(例如 curl)将确切的 JSON 正文传递给 API 会导致 API 产生错误。那么这里最好的方法是什么?
【问题讨论】:
【参考方案1】:事实证明,这更多是 API 的错误。 AFNetworking 具有以下代码,将 Content-Type 标头设置为 charset=utf-8
。
case AFJSONParameterEncoding:;
[request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error]];
break;
无论出于何种原因超出我的理解,他们的 API 不支持标题上的 charset
属性。
话虽如此,他们很快就解决了这个问题,现在无需修改上面显示的代码即可工作。
【讨论】:
我在使用 RestKit 时遇到了同样的问题,你能帮我看看需要修改哪些代码以及需要在哪个文件中进行修改吗? RestKit 仍然使用 AFN 1.3 所以我想我需要修改代码,你可以在这里回答我的问题***.com/questions/29318016/…以上是关于AFNetworking base64 参数,字符被 NSJSONSerialization 转义的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AFNetworking 在 UIImageView 中显示 base64 图像?
PHP base64_encode 在URL地址参数编码上使用