【问题标题】:AFNetworking base64 parameter, characters being escaped by NSJSONSerializationAFNetworking base64 参数,字符被 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 产生错误。那么这里最好的方法是什么?

【问题讨论】:

    标签: ios json base64 afnetworking nsjsonserialization


    【解决方案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 所以我想我需要修改代码,你可以在这里回答我的问题stackoverflow.com/questions/29318016/…
    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多