AFNetworking AFHTTPClient AFJSONRequestOperation不使用JSON操作

时间:2013-08-27 16:18:46

标签: ios objective-c json afnetworking

我关注了此截屏广播... 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操作。

所以responseObjectNSData而不是我期待的JSON object

我缺少使用JSON操作的任何配置吗?

2 个答案:

答案 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是否正常?