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";

Вопрос:

  1. Хороша ли концепция внедренного синглтона и нужны ли какие-либо изменения?

  2. Есть ли какие-либо предположения, если вся концепция неверна?

  3. Почему я получаю эту ошибку?

Благодарю.

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);

}];
Другие вопросы по тегам