简而言之:我尝试从服务器获取数据,并将http请求标头的content-type
设置为@"text/html
..但由于某种原因,RestKit将其更改为application/JSON
说明: 如果我只使用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中设置了一个断点,然后我检查了HTTPRequestOperation
创建的acceptableContentTypes,它没有!所以我假设RestKit只是放置自己的默认可接受的内容类型..我只是不知道在哪里以及如何防止它。想法?
p.s。我无法控制服务器,因此我无法将其content-type
标题更改为application/JSON
更新
事实证明,在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;
如何使用它来注册text/html
内容类型?
答案 0 :(得分:29)
RestKit通常需要一个MIMEType(JSON)作为其响应数据。但是,您可以使用您找到的方法告诉它处理其他类型,例如text/plain
和text/html
,根据我的经验,它非常方便。将此添加到我的RestKit配置(我在我的应用程序委托中执行)允许我接受application/json
和text/html
作为响应数据内容类型。
[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/html"];
在我的情况下,这也很有用,因为泽西岛 - 我公司后端团队使用的Web服务框架 - 将空载荷的内容类型默认为text/plain
,这会触发故障块,除非我具体说明已注册该MIMEType。
希望这有帮助。
答案 1 :(得分:-1)
我使用更改const值来输入从服务器api中恢复的类似
NSString * const RKMIMETypeJSON = @"text/html";
如果与JSON相同的recived文本结构,这种方法可以完美地运行