2013-12-14 33 views
2

我試圖讓GET HTTP響應。我需要獲取後續解析的html代碼,但responseObject爲零。無法獲得HTML代碼AFNetworking 2.0

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

[manager GET:@"http://www.example.com/" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSError *error; 
    HTMLParser *parser = [[HTMLParser alloc] initWithString:responseObject error:&error];  
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
+0

爲什麼不直接使用'operation.responseData'? –

+0

最初,我是這麼做的。但是我使用UTF-8,並且由於轉換爲NSString,我得到了零。您的解決方案也適用。我在下面寫的答案對我的應用程序體系結構更好。 – AlexEdunov

回答

8

爲了獲得html代碼,我們需要構建一個自定義響應序列化器來將來自Web服務器的NSData響應解碼爲NSString。我們需要繼承AFHTTPResponseSerializer並實現下面的方法:

- (id)responseObjectForResponse:(NSURLResponse *)response 
          data:(NSData *)data 
          error:(NSError *__autoreleasing *)error 
{ 
    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
} 
+0

但據我瞭解,它只是返回一個字符串之間的標籤? –

+0

這取決於你的任務。 – AlexEdunov

2

爲什麼,例如,你有沒有使用此解決方案,而不是下面的subcalssing。它做同樣的事情,但你不需要創建額外的文件,只是爲了超載一種方法。

所以你可以在塊中添加你的responseObjet編碼,例如,它也可以。我在我的例子中使用POST,但它應該以GET的方式工作,但沒有參數,但只是談話的想法。

+ (void)makeRequestWithParams:(NSDictionary *)params 
           success:(OperationCompletionBlock)success 
           failure:(OperationCompletionBlock)failure 
{ 
    NSString *path = @"http://www.example.com/"; 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    manager.responseSerializer = [AFCompoundResponseSerializer serializer]; 

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

    [manager POST:path parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 

     NSString* encodedString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 

     NSLog(@"%@", encodedString); 

     success(nil); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
     failure(nil); 
    }]; 
} 
+1

我並不是說我的決定是正確的。 – AlexEdunov