2013-10-26 2 views
7

Короче: я пытаюсь извлечь данные с сервера с content-type заголовка запроса HTTP установлен в @"text/html .. но по какой-то причине RestKit изменения, которые в application/JSONПочему RestKit меняет свой контент-ответ?

Объяснение: Если бы я сделать это запрос, используя только AFNetworking .. все работает как шарм .. это то, что мой AFNetworking код выглядит следующим образом:

AFHTTPClient *client = [AFHTTPClient alloc] initWithBaseURL: 
               [NSURL URLWithString:kApiBaseUrl]]; 
singleton.parameterEncoding = AFJSONParameterEncoding; 
[singleton setDefaultHeader:@"Accept" value:@"text/html"]; 
[client getPath:getPath parameters:nil success:successCallback failure:failureCallback]; 

Если я использую это точно такой же клиент и прикрепить его к

MyClient *client = [MyClient getSingleton]; //MyClient is instantiated as above   
self.objectManager = [[RKObjectManager alloc] initWithHTTPClient:client]; 
self.objectManager.managedObjectStore = self.managedObjectStore; 
// this should have already been done by my client, but putting 
// it here just to be sure 
[self.objectManager setAcceptHeaderWithMIMEType:@"text/html"]; 

[[RKObjectManager sharedManager] getObjectsAtPath:kGradesPath 
             parameters:nil 
              success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
// handle success 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
// handle failure 
}]; 

ошибка я получаю:

restkit.network:RKObjectRequestOperation.m:576 Object request failed: 
Underlying HTTP request operation failed with error: Error 
Domain=org.restkit.RestKit.ErrorDomain Code=-1016 "Expected content type {(
    "application/x-www-form-urlencoded", 
    "application/json" 
)}, got text/html" UserInfo=0x8f7acd0 

углубиться в тему .. я ставлю точку останова в managedObjectRequestOperationWithRequest, то я проверил acceptableContentTypes из HTTPRequestOperation создал, и это ноль! Поэтому я предполагаю, что RestKit просто устанавливает свои собственные допустимые типы контента по умолчанию. Я просто не знаю, где и как его предотвратить. идеи?

p.s. я не имею контроль над сервером, поэтому я не могу изменить его content-type заголовок application/JSON


Update:

Оказывается, что в RKObjectRequestOperation.m он получает mime-type от [RKMIMETypeSerialization registeredMIMETypes]; (линия 354) .. и поэтому в RKMIMETypeSerialization.h есть метод:

/** 
Registers the given serialization class to handle content for the given MIME Type identifier. 

MIME Types may be given as either a string or as a regular expression that matches the MIME Types for which the given serialization should handle. Serializations are searched in the reverse order of their registration. If a registration is made for an already registered MIME Type, the new registration will take precedence. 

@param serializationClass The class conforming to the RKSerialization protocol to be registered as handling the given MIME Type. 
@param MIMETypeStringOrRegularExpression A string or regular expression specifying the MIME Type(s) that given serialization implementation is to be registered as handling. 
*/ 
+ (void)registerClass:(Class<RKSerialization>)serializationClass forMIMEType:(id)MIMETypeStringOrRegularExpression; 

как я использую это зарегистри ter a text/html content-type?

ответ

29

RestKit обычно ожидает один MIMEType (JSON) для своих данных ответа. Однако вы можете сказать, что он обрабатывает другие типы, такие как text/plain и text/html, используя метод, который вы нашли, и по моему опыту это было очень удобно. Добавление этого в мою конфигурацию RestKit (что я делаю в моем делете приложения) позволяет мне принимать как application/json, так и text/html как типы данных данных ответа.

[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/html"]; 

В моем случае, это также полезно, потому что Джерси - рамки веб-службы бэкенд команда в моей компании использует - по умолчанию тип содержимого пустых полезных нагрузок для text/plain, который вызывает блоки отказа, если я не имею конкретно зарегистрирован для этого MIMEType.

Надеюсь, это поможет.

+0

могли быть некоторыми [побочными эффекты] (HTTP: //stackoverflow.com/questions/19607672/restkit-property-mapping-quesiton) к вышеуказанному? – abbood

+0

Не помогло в моем случае, у меня возникла новая ошибка: «Загрузили необработанный ответ (200) с типом контента« text/html »« –

+1

@VasyaVasyaa Я видел это раньше, и это обычно связано с настройкой моего ответа дескрипторы и коды успеха. –

-1

Я использую значение константного изменения к типу, который Получать от сервера апи как этого

NSString * const RKMIMETypeJSON = @"text/html"; 

если RECIVED структура текста так же, как JSON, этот подход работает отлично

Смежные вопросы