AFNetworking 關於JSON text did not start with array or object and option to allow fragments not set 錯誤


AFHTTPSessionManager *manager =[AFHTTPSessionManager manager];
    [manager GET:@"http://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *result = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"%@",result); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"%@",error); }];

在AFNetworking中 上述代碼將會 輸出

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x8ea19a0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

這是因為 AFNetworking默認把響應結果當成json來處理,(默認manager.responseSerializer = [AFJSONResponseSerializer serializer]) ,很顯然,我們請求的百度首頁 返回的並不是一個json文本,而是一個html網頁,但是AFNetworking並不知道,它堅信請求的結果就是一個json文本!然后固執地以json的形式去解析,顯然沒辦法把一個網頁解析成一個字典或者數組,所以產生了上述錯誤.

然而,我們期望它能夠正確地處理這個情形,而不是提示一個錯誤. 
這時候 你必須告訴AFNetworking:別把這個網頁當json來處理! 
只需要在發送請求前加入:manager.responseSerializer = [AFHTTPResponseSerializer serializer]

代碼變成:

    AFHTTPSessionManager *manager =[AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:@"http://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *result = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"%@",result); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"%@",error); }];
 

這樣,就可以正確地把baidu.com首頁的html源碼抓回來啦.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM