我关注了此截屏广播... 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)initWithBaseURL:(NSURL *)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 object
。
我缺少使用JSON操作的任何配置吗?
答案 0 :(得分:3)
在您的情况下,判断请求是否可由JSON操作处理的代码行如下:
return [[self acceptableContentTypes] intersectsSet:AFContentTypesFromHTTPHeader([request valueForHTTPHeaderField:@"Accept"])];
正如Mattt Thompson(AFNetworking
的作者)所解释here,您必须将请求的Accept
标头设置为application/json
。
这不直观,而且高度依赖于实现,但它确实有效。
添加
[self setDefaultHeader:@"Accept" value:@"application/json"];
到你的客户端初始化,无论路径扩展如何,都应该没问题。
答案 1 :(得分:1)
好的,因此如果请求网址扩展名不是json
,则会检查AFNetworking代码是否会触发JSON操作。
因为我的php
它正在抛弃它。
更改代码。
我的变化
在AFJSONRequestOperation
方法中......
+ (BOOL)canProcessRequest:(NSURLRequest *)request {
return [[[request URL] pathExtension] isEqualToString:@"json"] || [super canProcessRequest:request];
}
我把它改成了......
+ (BOOL)canProcessRequest:(NSURLRequest *)request {
// added php to the request valid path extensions.
return [[[request URL] pathExtension] isEqualToString:@"json"] || [super canProcessRequest:request] || [[[request URL] pathExtension] isEqualToString:@"php"];
}
这本身并不是一个错误,更像是对我开放的请求的随机语法风格。
让.php
请求返回JSON是否正常?