使用 RestKit 处理原始数据的响应

Posted

技术标签:

【中文标题】使用 RestKit 处理原始数据的响应【英文标题】:Handling response with raw data using RestKit 【发布时间】:2014-11-14 10:37:32 【问题描述】:

我正在使用 RestKit 0.23.3。

对于特定的路径模式(比如download_data/:dataId):

我可以毫无问题地通过 RestKit 发送请求, 我希望得到任意内容类型的响应(image/pngtext/plaintext/xml、...甚至是application/json), 如果服务器返回 2xx 状态码,我想在成功处理程序块中接收 HTTP 响应的主体作为 NSData 实例(无论内容类型如何)。

这是否可能(以及如何)使用 RestKit?

谢谢。

【问题讨论】:

为什么选择RestKit?,你可以轻松使用NSURLSession 我想知道这是否可以使用 RestKit 来完成,因为该框架可能对构建请求很有用,即使它对于处理响应来说是一种过度杀伤。 【参考方案1】:

使用新的 restkit 0.20.3,您可以执行您的 REST Web 服务,例如:

[[AppDelegate appDelegate].rkomForProbeList getObjectsAtPath:[NSString stringWithFormat:kResource_Probe,[[NSUserDefaults standardUserDefaults] valueForKey:kNS_DF_AccessRef]] parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
       NSLog(@"%@",operation.HTTPRequestOperation.responseString);
       // if raw data
 NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:[operation.HTTPRequestOperation.responseString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:NULL];
       // if mapped
       arrayForProbe = [[NSMutableArray alloc] initWithArray:mappingResult.array];             
    failure:^(RKObjectRequestOperation *operation, NSError *error) 
       NSLog(@"%@",operation.HTTPRequestOperation.responseString);
        NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:[,operation.HTTPRequestOperation.responseString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:NULL];

       NSLog(@"%@",operation.HTTPRequestOperation.response.statusCode);
       NSLog(@"%@",error.description);
       [self hideViewContentAsProbesNotAvailable];
   ];

通过映射,您将直接从映射数组中获取对象。为了解析原始数据,您可以从响应字符串中获取 json 对象。

rkomForProbeList 是您的 RKObjectManager 的实例。 kResource_Probe 是资源路径。就像如果基本 URL 是 http://www.hi.com/ 并且您的其余 api 需要 http://www.hi.com/login 那么“登录”将是您的资源路径。

【讨论】:

说实话,我不知道这段代码在做什么。 rkomForProbeListkResource_Probe 之类的标识符是什么? 成功处理程序是一个很好的地方,您可以直接访问 HTTP 响应。但是,如果响应具有内容类型,例如image/jpeg,您必须为此内容类型注册一个符合RKSerialization 的类。如果没有注册此类,则永远不会到达成功处理程序,并且 RestKit 将响应视为错误。响应可以直接在这个符合RKSerialization的类中进行处理(序列化),而不是success handler。 无论如何,我可能无法阻止 RestKit 将整个响应体加载到内存中。【参考方案2】:

我不熟悉 RESTKit,但无论如何它可能会对你有所帮助。 我建议你使用NSURLSession 来处理这样的低级请求,因为 RESTKit 添加了很多抽象,这对于这个任务来说是不必要的。

[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"http://yourSite.com"]
                                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) 
            NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
            if (statusCode >= 200 && statusCode < 300) 
                // that's OK
             else 
                // something wrong
            
        
    ] resume];

【讨论】:

感谢您的快速回答。当然,这是一种选择。但是,无论如何,我更喜欢使用 RestKit。首先,该应用程序发送许多不同的请求,RestKit 对大多数请求都非常有帮助。我不想要一个开箱即用的方法。其次,即使所有 RestKit 抽象对于响应处理都是奇怪的,它们对于发送请求也很有用。 RestKit 用于映射,如果您没有对响应进行映射,则不应使用 RestKit 发出请求(尽管您可以使用 RestKit 创建由 NSURLSession 发送的请求) .

以上是关于使用 RestKit 处理原始数据的响应的主要内容,如果未能解决你的问题,请参考以下文章

错误:“沙箱与 Podfile.lock 不同步...”在使用 cocoapods 安装 RestKit 后

RestKit .20 RKRequestDescriptor postObject - (400-499) 中的预期状态代码,得到 200

无法使用 RestKit 处理成功的 204 响应并正确映射失败的响应

restkit,如何在没有对象映射的情况下访问对象

RestKit 响应中的附加数据

RestKit 可以接收异步响应吗?