RestKit 0.20.0-rc1 mappingResult 304 Not Modified后为空

Posted

技术标签:

【中文标题】RestKit 0.20.0-rc1 mappingResult 304 Not Modified后为空【英文标题】:RestKit 0.20.0-rc1 mappingResult is empty after 304 Not Modified 【发布时间】:2013-02-13 06:07:42 【问题描述】:

我有一个指向 Rails 支持的 API 的简单客户端应用程序。它获取非托管对象如下:

[[RKObjectManager sharedManager] getObjectsAtPath:@"places" params:nil success:...]

我面临的问题是 RestKit 在刷新后不执行任何映射,因为响应是 304 Not Modified。

但是,在检查 operation.HTTPRequestOperation.responseData 时有一个 JSON 负载。即使响应为 304 Not Modified,我如何让 restkit 进行映射。

【问题讨论】:

【参考方案1】:

只是在我的项目中遇到了同样的问题。

看起来在 RestKit 0.20 中缓存被完全重新设计(实际上它已被删除,请看 github issue #209)。现在,当收到 NOT MODIFIED 响应时,它 doesn't parse 缓存响应正文。相反,它尝试使用所谓的“RKFetchRequestBlock”从持久存储中加载对象。你可以在这里阅读更多信息:http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html

因此,您需要为每个可以返回 304 响应的 URL 添加 RKFetchRequestBlock。 另一种选择是禁用 NSURLCaching,这在 RestKit 0.20 中并非易事。我使用以下代码:

ELObjectManager.h

@interface RKObjectManager ()
// So we can call [super requestWithMethod:...]
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                      path:(NSString *)path
                                parameters:(NSDictionary *)parameters;

@end

@interface ELObjectManager : RKObjectManager
@end

ELObjectManager.m

#import "ELObjectManager.h"

@implementation ELObjectManager

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                      path:(NSString *)path
                                parameters:(NSDictionary *)parameters

    NSMutableURLRequest* request = [super requestWithMethod:method path:path parameters:parameters];
    request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
    return request;


@end

然后用这个类代替RKObjectManager

[RKObjectManager setSharedManager:[ELObjectManager managerWithBaseURL:...]

【讨论】:

您好 glyuck,感谢您的回答。我实际上发现我没有为每个响应描述符添加 pathPattern:,因此如果使用 CoreData,RestKit 默认为 RKManagedObjectRequestOperation。一旦我为每个响应对象指定了路径模式,Restkit 就能够区分并使用正确的 RKObjectRequestOperation 而不是 RKManagedRequestOperation。我认为这暂时解决了我的问题。 我尝试了@glyuck 提出的解决方案(子类化RKObjectManager 并将cachePolicy 设置为NSURLRequestReloadIgnoringLocalAndRemoteCacheData)无济于事。正如this post 所见,NSURLRequestReloadIgnoringLocalAndRemoteCacheData 尚未在NSURLRequest 中实现。 Ninja 编辑: 我的下一步是修改我的 API 服务,使其永远不会发送 304 标头。【参考方案2】:

我也遇到了同样的问题,更糟糕的是服务器状态码实际上是200而不是304。mappingResult也是null,实际数据可以在原帖中的operation.HTTPRequestOperation.responseData中找到.我正在运行 0.20.0。如果有适合我的解决方法,请告诉我。

以下显示即使状态码为 200,mappingResult 为空。responseData 太长,无法发布。我也在使用 RestKit 的核心数据集成。

2013-04-25 16:38:14.244 MyApp[58584:c07] I restkit.network:RKHTTPRequestOperation.m:185 GET 'http://localhost:3000/api/search?access_token=3ad3b8c4a5fed9503a80c1f6afebab47&keywords=art' (200 OK) [0.0047 s]
(lldb) po mappingResult
$0 = 0x079a1880 <RKMappingResult: 0xac64c80, results=
    "<null>" =     (
    );
>
(lldb) po operation
$1 = 0x07995fd0 <RKManagedObjectRequestOperation: 0x7995fd0, state: Successful, isCancelled=NO, request: <NSMutableURLRequest http://localhost:3000/api/search?access_token=3ad3b8c4a5fed9503a80c1f6afebab47&keywords=art>, response: <NSHTTPURLResponse: 0x7e51fc0 statusCode=200 MIMEType=application/json length=58781>>
(lldb) 

【讨论】:

我有一个解决这个问题的方法,方法是在查询字符串中添加一个缓存破坏器参数。

以上是关于RestKit 0.20.0-rc1 mappingResult 304 Not Modified后为空的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.20.0 rc1 - 使用字符串数组创建请求帖子

RestKit 0.20.0-rc1 mappingResult 304 Not Modified后为空

Restkit 0.20.rc 需要但不包含多个 0.10 项

iOS RestKit 自定义错误处理

javascript ES mappin

无法启动嵌入式容器;嵌套异常是 java.lang.IllegalArgumentException: Invalid <url-pattern> */ in servlet mappin