请求失败:无法接受的内容types:使用AFNetworking 2.0的text / html

我正在尝试AFNetworking的新版本2.0,我得到上面的错误。 任何想法为什么发生这种情况? 这是我的代码:

NSURL *URL = [NSURL URLWithString:kJSONlink]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; op.responseSerializer = [AFJSONResponseSerializer serializer]; [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; [[NSOperationQueue mainQueue] addOperation:op]; 

任何想法将不胜感激。 如果有帮助,我也使用Xcode 5.0。 谢谢!

另外,这里是错误信息:

 Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0xda2e670 {NSErrorFailingURLKey=kJSONlink, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xda35180> { URL: kJSONlink } { status code: 200, headers { Connection = "Keep-Alive"; "Content-Encoding" = gzip; "Content-Length" = 2898; "Content-Type" = "text/html"; Date = "Tue, 01 Oct 2013 10:59:45 GMT"; "Keep-Alive" = "timeout=5, max=100"; Server = Apache; Vary = "Accept-Encoding"; } }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html} 

我只是使用kJSONlink隐藏JSON。 这应该返回一个JSON。

这意味着你的服务器正在发送"text/html"而不是已经支持的types。 我的解决scheme是将"text/html"添加到在AFURLResponseSerialization类中设置的AFURLResponseSerialization 。 只需search“acceptableContentTypes”并手动添加@"text/html"到设置。

当然,理想的解决scheme是更改从服务器发送的types,但为此您必须与服务器组进行交谈。

将我的RequestOperationManager Response Serializer设置为HTTPResponseSerializer修复了这个问题。

Objective-C的

 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

迅速

 manager.responseSerializer = AFHTTPResponseSerializer() 

做这个改变意味着我不需要添加acceptableContentTypes到我做的每个请求。

我把@ jaytrixz的回答/评论更进一步,并将“text / html”添加到现有的一组types中。 这样,当他们在服务器端修复“application / json”或“text / json”时,我声称它可以无缝工作。

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; 

在服务器端,我补充道:

 header('Content-type: application/json'); 

到我的.php代码,这也解决了这个问题。

我从另一个angular度解决这个问题。

我想如果服务器发送JSON数据与Content-Type: text/html标题。 这并不意味着服务器人打算发送给你一些HTML,但不小心改变为JSON。 这意味着服务器人员不关心什么是Content-Type头。 所以,如果服务器人不关心客户端,那么最好忽略Content-Type头。 要忽略AFNetworkingContent-Type标题检查

 manager.responseSerializer.acceptableContentTypes = nil; 

通过这种方式, AFJSONResponseSerializer (默认的)将序列化JSON数据而不检查响应头中的Content-Type

一个简单的方法来启用接收“文本/纯文本”的内容types:

 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; 

同样如果你想启用“text / html”内容types:

 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

我根据@Andrie的回答尝试下线,但没有奏效,

 op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

所以在狩猎之后,我做了一些工作,使它成功地工作。

这是我的代码片段。

 AFHTTPRequestOperationManager *operation = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url]; operation.responseSerializer = [AFJSONResponseSerializer serializer]; AFJSONResponseSerializer *jsonResponseSerializer = [AFJSONResponseSerializer serializer]; NSMutableSet *jsonAcceptableContentTypes = [NSMutableSet setWithSet:jsonResponseSerializer.acceptableContentTypes]; [jsonAcceptableContentTypes addObject:@"text/plain"]; jsonResponseSerializer.acceptableContentTypes = jsonAcceptableContentTypes; operation.responseSerializer = jsonResponseSerializer; 

希望这会帮助那里的人。

这是我发现的唯一工作

 -(void) testHTTPS { AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init]; [securityPolicy setAllowInvalidCertificates:YES]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager setSecurityPolicy:securityPolicy]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:[NSString stringWithFormat:@"%@", HOST] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"%@", string); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; } 

如果有人正在使用AFHTTPSessionManager那么可以这样做来解决这个问题,

我分类AFHTTPSessionManager我在做这样的,

 NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes]; [contentTypes addObject:@"text/html"]; self.responseSerializer.acceptableContentTypes = contentTypes; 

只需添加这一行:

 operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

在我的情况下,我没有控制服务器设置,但我知道它期待“应用程序/ JSON”的“内容types”。 我在iOS客户端做了这个:

 manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

请参阅AFNetworking版本2内容types错误

  UIImage *image = [UIImage imageNamed:@"decline_clicked.png"]; NSData *imageData = UIImageJPEGRepresentation(image,1); NSString *queryStringss = [NSString stringWithFormat:@"http://119.9.77.121/lets_chat/index.php/webservices/uploadfile/"]; queryStringss = [queryStringss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; [MBProgressHUD showHUDAddedTo:self.view animated:YES]; [manager POST:queryStringss parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:imageData name:@"fileName" fileName:@"decline_clicked.png" mimeType:@"image/jpeg"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSDictionary *dict = [responseObject objectForKey:@"Result"]; NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject); [MBProgressHUD hideAllHUDsForView:self.view animated:YES]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [MBProgressHUD hideAllHUDsForView:self.view animated:YES]; NSLog(@"Error: %@ ***** %@", operation.responseString, error); }]; 

我有一个类似的问题与AFNetworking从一个Swift代码库一起工作,所以我只是在远程的情况下离开这里,有人是不幸的,因为我不得不在这样的设置工作。 如果你是,我觉得你哥们,保持坚强!

该操作由于“不可接受的内容types”而失败,尽pipe我实际上使用包含所讨论的内容types值的Set设置acceptableContentTypes

对我来说,解决scheme是调整Swift代码,使之更加Objective-C友好, 我想

 serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject> 

一个好的问题总是有多个答案,以减less和帮助你select正确的答案,在这里我也join自己的答案。 我已经testing它,它工作正常。

 AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.yourdomain.com/appname/data/ws/index.php/user/login/"]]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager POST:@"POST" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *json = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"%@", json); //Now convert json string to dictionary. } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error.localizedDescription); }];