在 RestKit 映射它之前访问 JSON 响应

Posted

技术标签:

【中文标题】在 RestKit 映射它之前访问 JSON 响应【英文标题】:Access JSON response before RestKit maps it 【发布时间】:2014-07-31 23:54:25 【问题描述】:

我使用的 API 将 )]' 预先添加到每个 JSON 响应中,显然是作为一种安全措施。例如

response.body=)]',
["id":13,"name":"Demo Company","total_amount_due":15714.2]

RestKit 无法映射它,因此我需要在映射之前从响应中删除第一项。

最好的方法是什么?

【问题讨论】:

问题更多在于在 RestKit 尝试映射之前访问响应 这是一项安全措施吗?安全防范什么? 不确定。我自己也觉得很奇怪。 @Wain 这是针对跨站点脚本和其他非法访问模式的措施。通过在不提前知道如何使其有效的情况下使 JSON 无效,未经授权的用户很难解释输入。当然,一旦您看到原始字符串,就很容易解决。但它可以防止很多自动攻击。 【参考方案1】:

通过创建MyJsonSerialization 类解决了这个问题:

@interface MyJsonSerialization : NSObject <RKSerialization>

@end


@implementation MyJsonSerialization

+ (id)objectFromData:(NSData *)data error:(NSError **)error

    NSString* responseStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSData *refinedData = data;

    if ([responseStr hasPrefix:@")]',"])
        NSRange range = NSMakeRange(5, data.length - 5);
        refinedData = [data subdataWithRange:range];
    

    id result = [NSJSONSerialization JSONObjectWithData:refinedData options:0 error:error];

    return result;


+ (NSData *)dataFromObject:(id)object error:(NSError **)error

    return [NSJSONSerialization dataWithJSONObject:object options:0 error:error];


@end

并像这样使用它:

[RKMIMETypeSerialization registerClass:[MyJsonSerialization class] forMIMEType:@"application/json"];

【讨论】:

以上是关于在 RestKit 映射它之前访问 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

RestKit映射成功后如何访问对象

restkit 映射嵌套数组为空(带有 json 响应的嵌套 restkit 请求)

Restkit 0.20 对象在获取 json 响应后未映射

使用 RESTKit 映射带有括号的 JSON 响应

防止空 JSON 响应被映射 RestKit 0.22.0

来自 JSON 的 RestKit 对象映射