2013-08-27 65 views
2

我跟着這個截屏... http://nsscreencast.com/episodes/6-afnetworkingAFNetworking AFHTTPClient AFJSONRequestOperation不使用JSON操作

我單身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操作?

回答

3

的是,在你的情況是決定該請求是否是一個JSON操作處理的代碼行如下:

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

正如馬特·湯普森(的AFNetworking作者)解釋here你必須設置請求的Accept標題爲application/json

這不是直觀的,它依賴於高度實現,但它的工作原理。

添加

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

到客戶端初始化,它應該是好的,不管通道延伸區。

+1

謝謝:)完成它的工作。 – Fogmeister

+0

不客氣。很高興我能幫上忙。 –

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請求是否正常?

+0

你改變了什麼? 'AFNetworking'代碼?可以[this](http://stackoverflow.com/questions/9159004/issue-with-retrieving-json-with-afnetworking)有關係嗎? –

+0

在任何情況下,你應該在github上填寫問題;) –

+0

我已經編輯了我的答案,以顯示我如何「修復」它。 – Fogmeister

相關問題