使用 RestKit 处理原始数据的响应
Posted
技术标签:
【中文标题】使用 RestKit 处理原始数据的响应【英文标题】:Handling response with raw data using RestKit 【发布时间】:2014-11-14 10:37:32 【问题描述】:我正在使用 RestKit 0.23.3。
对于特定的路径模式(比如download_data/:dataId
):
image/png
、text/plain
、text/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 那么“登录”将是您的资源路径。
【讨论】:
说实话,我不知道这段代码在做什么。rkomForProbeList
、kResource_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