使用AFNetworking解析内容类型文本/ html

时间:2014-09-30 14:40:59

标签: ios objective-c json afnetworking afnetworking-2

我必须在我的应用中实现版本检查器。该应用程序将检查服务器的版本(手动设置)。事实上,服务器不会在JSONXML中返回响应。它以简单的text/html返回,我不熟悉。

例如。如果应用需要更新,它将返回如下响应。

<checkversion>
    <update>TRUE</update>
    <status>MINOR</status>
    <alert></alert>
    <version>1.0.0</version>
    <ituneslink>0</ituneslink>
</checkversion>

否则,它将返回如下响应。

<checkversion>
    <update>FALSE</update>
</checkversion>

在查看了thisthis等类似的SO帖子后,我设法以string的格式获得响应。以下是我的代码片段。

- (void)slurpVersionChecker
{
    NSString *versionURL = @"api";
    NSDictionary *params = @{@"api_key":@"key"};

    AFHTTPRequestOperationManager *requestManager = [AFHTTPRequestOperationManager manager];
    [requestManager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
    [requestManager POST:versionURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"version: %@", string);

    }failure:^(AFHTTPRequestOperation *operation, NSError *error){
        NSLog(@"failed to check version: %@", error);
    }];

}

问题是,我如何解析每个回复?是否有任何方法可以直接通过responseObject解析响应,而无需将其转换为String

2 个答案:

答案 0 :(得分:0)

好。我已经设法解决了这个问题,所以我不妨在这里为其他人发布解决方案。

这是我基本上做的事情。

我使用XMLReader将响应解析为NSDictionary。因此,将库添加到我的项目并在标题中导入XMLReader.h。然后,我只需要调用dictionaryForXMLDAta方法来使用它返回:

checkversion = {
version: {
    alert =     {
        text = "";
    };
    ituneslink =     {
        text = 0;
    };
    status =     {
        text = MINOR;
    };
    text = "";
    update =     {
        text = TRUE;
    };
    version =     {
        text = "1.0.0";
    };
}

NSDictionary返回并不是那么漂亮。所以,我不得不使用objectForKey几次来检索值。

[requestManager POST:versionURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSData * data = (NSData *)responseObject;
        NSError *error = nil;
        NSDictionary *dict = [XMLReader dictionaryForXMLData:data
                                                     options:XMLReaderOptionsProcessNamespaces
                                                       error:&error];
        NSDictionary *version = [dict objectForKey:@"checkversion"];
        update = [[version objectForKey:@"update"] objectForKey:@"text"];
        ...
    }

奖励:我想通知用户是否有可用的新更新。因此,我检查update变量是否等于TRUE,如果它是TRUE,它会将用户链接到应用商店。

if([update isEqualToString:@"TRUE"]) {
            number = [[version objectForKey:@"version"] objectForKey:@"text"];
            itunesURL = [[version objectForKey:@"ituneslink"] objectForKey:@"text"];

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Version Available" message:nil delegate:self cancelButtonTitle:@"Not Now" otherButtonTitles:@"Download", nil];
            [alert show];

        }

这就是我解决它的方式。

答案 1 :(得分:0)

请尝试以下代码:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager new];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];