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 图像?

在 afnetworking iOS 中获取字符串响应

RSA公钥只返回一串base64字符 怎么使用

PHP base64_encode 在URL地址参数编码上使用

javascript Url 传参的坑,base64参数和url参数之间的转移

powershell -enc参数无法解码base64编码payload的解决方案