乐趣区

关于ios:AFNetworking请求XML

前言:

http 协定是服务器与客户端交换数据最常见的形式。一般来说,数据格式是 JSON,也有 XML 的状况。JSON 格局都会解析,如何解析 XML 呢?
—— 本文是基于 AFNetworking3.2.1 版本

参考资料:

https://stackoverflow.com/que…
https://stackoverflow.com/que…
划重点

一般来说,咱们进行 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 的用法:

AFNetworking 是最根本的 iOS 开发技巧,此处就不给出具体实现的 Demo 了。XML 解析最重要的是设置 AFHTTPSessionManager 对象的 responseSerializer 属性值为 AFXMLParserResponseSerializer 对象。

退出移动版