【问题标题】:AFNetworking AFHTTPClient AFJSONRequestOperation not using JSON OperationAFNetworking AFHTTPClient AFJSONRequestOperation 不使用 JSON 操作
【发布时间】:2013-08-30 12:20:23
【问题描述】:

我关注了这个截屏视频...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 操作的任何配置吗?

【问题讨论】:

    标签: ios objective-c json afnetworking


    【解决方案1】:

    好的,如果请求 url 扩展名不是 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 是否正常?

    【讨论】:

    • 你改变了什么? AFNetworking 代码? this 可以关联吗?
    • 无论如何你都应该在 github 上填写 issue ;)
    • 您检查过super 的实现吗?
    • 嗯...它检查“ContentType”标头值。
    【解决方案2】:

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

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

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

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

    添加

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

    到你的客户端初始化,应该没问题,不管路径扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2012-12-24
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多