2

我关注了这个截屏视频... 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不是我NSDataJSON object期待的。

我错过了使用 JSON 操作的任何配置?

4

2 回答 2

3

在您的情况下,决定请求是否可由 JSON 操作处理的代码行如下:

return [[self acceptableContentTypes] intersectsSet:AFContentTypesFromHTTPHeader([request valueForHTTPHeaderField:@"Accept"])];

正如Mattt Thompson(的作者)在此处AFNetworking解释的,您必须将Accept请求的标头设置为application/json.

这并不直观,并且高度依赖于实现,但它确实有效。

添加

[self setDefaultHeader:@"Accept" value:@"application/json"];

到您的客户端初始化,无论路径扩展如何,它都应该没问题。

于 2013-08-27T16:34:31.310 回答
1

好的,如果请求 url 扩展名不是 ,则在 AFNetworking 代码中进行检查,该代码会执行 JSON 操作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是否正常?

于 2013-08-27T16:26:46.800 回答