AFNetworking получает данные для ошибки синтаксического анализа XML
Это мой AFHTTPClient синглтон:
+ (API *)sharedInstance
{
static API *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[API alloc] initWithBaseURL:[NSURL URLWithString:kAPIHost]];
[sharedInstance setParameterEncoding:AFJSONParameterEncoding];
[sharedInstance registerHTTPOperationClass:[AFXMLRequestOperation class]];
[sharedInstance setDefaultHeader:@"Accept" value:@"application/rss+xml"];
});
return sharedInstance;
}
И метод в том же классе (AFHTTPClient):
- (void)requestXMLDataCompletion:(JSONResponseBlock)completionBlock
{
NSMutableURLRequest *apiRequest = [self requestWithMethod:@"GET" path:kAPIPath parameters:nil];
AFXMLRequestOperation *operation = [[AFXMLRequestOperation alloc] initWithRequest:apiRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
// success
completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// failure
completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
}];
[operation start];
}
Когда я вызываю эту функцию для получения XML из RSS, я получаю эту ошибку:
error = "Expected content type {(\n \"application/xml\",\n \"text/xml\"\n)}, got application/rss+xml";
Вопрос:
Хороша ли концепция внедренного синглтона и нужны ли какие-либо изменения?
Есть ли какие-либо предположения, если вся концепция неверна?
Почему я получаю эту ошибку?
Благодарю.
2 ответа
Concept of Singleton
Синглтон более известен как шаблон проектирования. Обычно синглтон является классом и ведет себя точно так же, как и любой другой класс, единственное исключение состоит в том, что любые экземпляры синглтона ссылаются на одни и те же данные объекта. Это означает, что любой экземпляр одноэлементного класса фактически является одним и тем же экземпляром.
Вы можете проверить шаблон Singleton для получения дополнительной информации и примера кода, чтобы определить, как будет использоваться singleton.
Is there any suggestion if whole concept is wrong ?
Я бы посоветовал вам использовать Singleton для AFNetworking, так как у вас будет только один его экземпляр.
Your Error
Ошибка, которую вы получаете, заключается в том, что запрос AFNetworking требует тип содержимого заголовка как "application/xml" или "text/xml"
Попробуйте изменить этот код:
[self registerHTTPOperationClass:[AFXMLRequestOperation class]];
в
[self registerHTTPOperationClass:[AFHTTPRequestOperation class]];
У меня была похожая проблема:
Error Domain=AFNetworkingErrorDomain Code=-1016 "Expected content type {(
"text/xml",
"application/xml"
)}, got application/rss+xml"
Ответ выше не полный и ясный, хотя он мне очень помог после того, как я прочитал их чат. registerHTTPOperationClass
не помогает Я решил предоставить некоторый код. Решение НЕ использовать это:
[AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser)
Но скачать RSS XML
с помощью AFHTTPRequestOperation
и создать NSXMLParser
вручную:
NSString *articlesUrlString = @"http://pro.rabota.ru/feed/moscow.content.rss";
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:articlesUrlString]];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"" parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSData *xmlData = (NSData *)responseObject;
NSXMLParser *XMLParser = [[NSXMLParser alloc] initWithData:xmlData];
XMLParser.delegate = self;
[XMLParser parse];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error: %@", error);
}];