我正在尝试使用AFNetworking 2.0来执行我的网络请求,但我遇到了一些奇怪的行为。我已将AFHTTPSessionManager
子类化为suggested in the documentation并提供了一个类方法,该方法返回一个单例对象,该对象具有基本URL设置以及设置我的auth标头。
+ (id)sharedInstance {
static dispatch_once_t once;
static MyHTTPClient *sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] initWithBaseURL: NSURLURLWithString:kPlatformAPIBaseURL]];
});
//Uncommenting this line makes the error go away
//sharedInstance.responseSerializer = [AFJSONResponseSerializer serializer];
//get latest session id everytime someone gets an instance of the client
sharedInstance.sessionId = [MySessionManager getSessionId];
return sharedInstance;
}
- (instancetype)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if(self) {
self.sessionId = [FSSessionManager getSessionId];
self.serializer = [AFHTTPRequestSerializer serializer];
[_serializer setValue:_sessionId forHTTPHeaderField:kAuthorizationHeader];
[_serializer setValue:@"application/json" forHTTPHeaderField:kAcceptHeader];
self.requestSerializer = _serializer;
}
return self;
}
- (void)setSessionId:(NSString *)sessionId {
_sessionId = sessionId;
[self.serializer setValue:_sessionId forHTTPHeaderField:kAuthorizationHeader];
}
我的应用使用它来发出POST请求来验证我的用户。这很好用。然后我发出GET请求来检索对象列表。也很棒。然后,我发出相同的GET请求,我收到网络错误Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: application/json"
这是完全相同的GET请求,但在第二次调用时失败。当我取消注释sharedInstance.responseSerializer
行时,每次我获得对共享实例的引用时,我都会创建响应序列化程序的新实例,然后我就不会再出现此错误。
responseSerializer是否可以安全地多次使用?感觉就像某种状态在请求中徘徊。设置它的正确方法是什么?
答案 0 :(得分:7)
响应序列化器可以安全地多次使用。根据您发布的错误消息“不可接受的内容类型:application / json”,您似乎将responseSerializer
设置为代码中其他位置的其他内容。只要JSON设置为[AFJSONResponseSerializer serializer]
,它就会正确序列化。