博客 / 詳情

返回

AFNetworking請求XML

前言:

http協議是服務器與客户端交流數據最常見的方式。一般來説,數據格式是JSON,也有XML的情況。JSON格式都會解析,如何解析XML呢?
—— 本文是基於AFNetworking3.2.1版本

參考資料:

https://stackoverflow.com/que...
https://stackoverflow.com/que...
劃重點image.png

一般來説,我們進行HTTP請求,會實例化一個AFHTTPSessionManager對象,並設置一些屬性:

manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", @"text/plain",nil];
manager.requestSerializer.timeoutInterval = 30.0f;

此處我們沒有設置managerresponseSerializer屬性,responseSerializer默認類型是AFJSONResponseSerializer,很明顯要進行請求XML格式的數據,不能使用AFJSONResponseSerializer
以下是關鍵代碼:

AFXMLParserResponseSerializer *response = [AFXMLParserResponseSerializer serializer];
manager.responseSerializer = response;

網上有些説法是

AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
response.acceptableContentTypes = [NSSet setWithObjects:@"text/xml", nil];
manager.responseSerializer = response;

這種用法是不對的!這裏responseSerializer的類型必須是AFXMLParserResponseSerializer,至於為何會出現這樣的解決方案,可能是因為答者簡單的看到錯誤返回是“不能接收text/xml類型的數據”而猜測的答案,並沒有加以驗證;或者説,此方法在低版本的 AFNetworking 中可以使用。

用法如下

[manager GET:url parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSLog(@"LenovoID 登錄請求結果:%@",responseObject);
    NSXMLParser *xmlparser = responseObject;
    [xmlparser setDelegate:self];
    [xmlparser parse];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"LenovoID 登錄請求失敗:%@", [error localizedDescription]);
}];

要實現NSXMLParserDelegate協議

#pragma mark - NSXMLParser delegate
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"XML文檔開始");
}

-(void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"XML文檔結束");
}

- (void)parser:(NSXMLParser *)parser foundElementDeclarationWithName:(NSString *)elementName model:(NSString *)model{
    NSLog(@"elementName:%@",elementName);
}

參考資料中有指明NSXMLParser的用法:
image.png

AFNetworking是最基本的iOS開發技巧,此處就不給出具體實現的Demo了。XML 解析最重要的是設置AFHTTPSessionManager對象的responseSerializer屬性值為AFXMLParserResponseSerializer對象。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.