我关注了这个截屏视频... http://nsscreencast.com/episodes/6-afnetworking
我的单例 AFHTTPClient 代码是...
+ (MyClient *)sharedInstance
{
static dispatch_once_t once;
static MyClient *myClient;
dispatch_once(&once, ^ { myClient = [[MyClient alloc] initWithBaseURL:[NSURL URLWithString:MyBaseURL]];});
return myClient;
}
- (id)initWithBaseURLNSURL *)url
{
self = [super initWithBaseURL:url];
if (self) {
// these are not actual values but I am setting default headers.
[self setDefaultHeader"sdfg" value"4"];
[self setDefaultHeader"std" value"3"];
[self setDefaultHeader"reg" value"5"];
[self setDefaultHeader"yu" value"1"];
[self setDefaultHeader"xv" value"3"];
[self setDefaultHeader:@"hmm" value:@"5"];
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
}
return self;
}
然后我像...一样执行它
[[MyClient sharedInstance] getPath:@"blah.php" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSMutableArray *stats = [NSMutableArray array];
// it crashes on the next line because responseObject is NSData
for (NSDictionary *dictionary in responseObject) {
CCStatistic *stat = [[CCStatistic alloc] initWithDictionary:dictionary];
[stats addObject:stat];
}
self.stats = stats;
[self.tableView reloadData];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error retrieving!");
NSLog(@"%@", error);
}];
一切正常。我已经用 Charles 拦截了它,它正在发送正确的请求并接收正确的 JSON,但该操作不是 JSON 操作。
所以 responseObject 是 NSData 而不是我期望的 JSON 对象 。
我错过了使用 JSON 操作的任何配置吗?
Best Answer-推荐答案 strong>
在您的情况下,决定请求是否可由 JSON 操作处理的代码行如下:
return [[self acceptableContentTypes] intersectsSet:AFContentTypesFromHTTPHeader([request valueForHTTPHeaderField:@"Accept"])];
如解释 here通过 Mattt Thompson(AFNetworking 的作者),您必须将请求的 Accept header 设置为 application/json 。
这并不直观,并且高度依赖于实现,但它确实有效。
添加
[self setDefaultHeader:@"Accept" value:@"application/json"];
到你的客户端初始化,应该没问题,不管路径扩展。
关于ios - AFNetworking AFHTTPClient AFJSONRequestOperation 不使用 JSON 操作,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/18470748/
|