2012-07-06 54 views
4

我正在尝试为我的restkit调用设置标题值。但是,这些似乎并不奏效。如何在Restkit中设置标题值

我想设置Content-TypeAccept头来application/json

任何想法,问题出在哪里?

谢谢!

RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
[[objectManager client] setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[[objectManager client] setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

RKURL *URL = [RKURL URLWithBaseURL:[objectManager baseURL] resourcePath:@"https://stackoverflow.com/users/sign_in.json" queryParameters:params]; 

[objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@?%@", [URL resourcePath], [URL query]] delegate:self]; 

回答

9

我不认为这是太明显了,虽然它是在documentation(我还没有尝试过TBH),但是在对象管理器有一个serializationMIMEType财产。还有已定义的常量JSON,因此您的代码可能会是这样的:

objectManager.serializationMIMEType = RKMIMETypeJSON; 

根据该文档,应用程序/ JSON是接受反正默认的,但可以通过acceptMIMEType属性来指定。

+0

只是要提:这仅仅是接受而不是Content-Type – 2016-03-15 08:29:24

3

你有这个选项

[kGlobalObjectManager() loadObjectsAtResourcePath: @"path" usingBlock: ^(RKObjectLoader *loader) { 
    NSDictionary* dictionary = [NSDictionary dictionaryWithObject: @"VALUE" forKey: @"HEADER NAME"]; 
    loader.additionalHTTPHeaders = dictionary; 
    loader.delegate = self; 
}]; 

更具体到你的问题,你有[RKObjectManager setAcceptMIMEType:]

0

在类RKObjectManager存在方法

** 
This method is the `RKObjectManager` analog for the method of the same name on `AFHTTPClient`. 
*/ 
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
             path:(NSString *)path 
           parameters:(NSDictionary *)parameters 
{ 
    NSMutableURLRequest* request; 
    if (parameters && !([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"])) { 
     // NOTE: If the HTTP client has been subclasses, then the developer may be trying to perform signing on the request 
     NSDictionary *parametersForClient = [self.HTTPClient isMemberOfClass:[AFHTTPClient class]] ? nil : parameters; 
     request = [self.HTTPClient requestWithMethod:method path:path parameters:parametersForClient]; 

     NSError *error = nil; 
     NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.HTTPClient.stringEncoding)); 
     [request setValue:[NSString stringWithFormat:@"%@; charset=%@", self.requestSerializationMIMEType, charset] forHTTPHeaderField:@"Content-Type"]; 
     NSData *requestBody = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:self.requestSerializationMIMEType error:&error]; 
     [request setHTTPBody:requestBody]; 
    } else { 
     request = [self.HTTPClient requestWithMethod:method path:path parameters:parameters]; 
    } 

    return request; 
} 

这里存在替代内容类型,你可以早配置RestKit时设置为

[[[RKObjectManager sharedManager] HTTPClient] setDefaultHeader:@"Content-Type" value:@"application/json"]; 

对于这种将工作,我发现(不漂亮,但工程)的解决方案,我做了

@interface RKObjectManager (BBContentType) 

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
             path:(NSString *)path 
           parameters:(NSDictionary *)parameters; 

@end 

@implementation RKObjectManager (BBContentType) 

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
             path:(NSString *)path 
           parameters:(NSDictionary *)parameters 
{ 
    NSMutableURLRequest* request; 
    if (parameters && !([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"])) { 
     // NOTE: If the HTTP client has been subclasses, then the developer may be trying to perform signing on the request 
     NSDictionary *parametersForClient = [self.HTTPClient isMemberOfClass:[AFHTTPClient class]] ? nil : parameters; 
     request = [self.HTTPClient requestWithMethod:method path:path parameters:parametersForClient]; 
     NSError *error = nil; 
     NSData *requestBody = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:self.requestSerializationMIMEType error:&error]; 
     [request setHTTPBody:requestBody]; 
    } else { 
     request = [self.HTTPClient requestWithMethod:method path:path parameters:parameters]; 
    } 

    return request; 
} 
@end 

类我只是切两线

NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.HTTPClient.stringEncoding)); 
[request setValue:[NSString stringWithFormat:@"%@; charset=%@", self.requestSerializationMIMEType, charset] forHTTPHeaderField:@"Content-Type"]; 
相关问题