22

按照本教程,我正在使用 HTML 请求制作一个基本的 iPhone 应用程序。

本教程让我在 AFNetworking 中使用 AFJSONRequestOperation。问题是,我使用的是 AFNetworking 版本 2,它不再具有 AFJSONRequestOperation。

所以,当然,这段代码(大约从教程的一半开始,在标题“查询 iTunes Store Search API ”下)不能编译:

NSURL *url = [[NSURL alloc]
    initWithString:
    @"http://itunes.apple.com/search?term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"%@", JSON);
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response,
        NSError *error, id JSON) {
            NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];
[operation start];

我的问题是,我应该用什么替换 AFJSONRequestOperation 才能继续使用 AFNetworking 2.x?我用谷歌搜索了这个,发现似乎没有其他人在问这个问题。

4

2 回答 2

30

你可以使用 AFHTTPSessionManger 吗?所以像

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager GET:[url absoluteString]
  parameters:nil
     success:^(NSURLSessionDataTask *task, id responseObject) {
         NSLog(@"JSON: %@", responseObject);
     }
     failure:^(NSURLSessionDataTask *task, NSError *error) {
        // Handle failure
     }];

另一种选择可能是使用AFHTTPRequestOperation并再次将 responseSerializer 设置为[AFJSONResponseSerializer serializer]. 所以像

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] 
                                            initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation
                                                        , id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // Handle error
}];
于 2014-01-22T21:23:05.847 回答
7

来自NSHipster 关于 AFNetworking 2 的文章

AFNetworking 2.0 新架构的突破之一是使用序列化器来创建请求和解析响应。序列化器的灵活设计允许将更多的业务逻辑转移到网络层,并且可以轻松定制以前内置的默认行为。

在 AFNetworking 2 中,序列化程序(将 HTTP 数据转换为可用的 Objective C 对象的对象)现在是与请求操作对象分开的对象。

AFJSONRequestOperation 等因此不再存在。

AFJSONResponseSerializer 文档

AFJSONResponseSerializerAFHTTPResponseSerializer验证和解码 JSON 响应的子类。

有几种方法可以访问您提到的 API。这是一个:

NSURL *url = [[NSURL alloc] initWithString:@"http://itunes.apple.com/search?term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"success: %@", operation.responseString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"error: %@",  operation.responseString);
}];

[operation start];
于 2014-01-22T21:36:43.183 回答