我正在尝试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。
答案 0 :(得分:357)
这意味着您的服务器正在发送"text/html"
而不是已支持的类型。
我的解决方案是将"text/html"
添加到acceptableContentTypes
类中设置的AFURLResponseSerialization
。只需搜索&#34; acceptableContentTypes&#34;并手动将@"text/html"
添加到集合中。
当然,理想的解决方案是更改从服务器发送的类型,但为此您将不得不与服务器团队交谈。
答案 1 :(得分:178)
将我的RequestOperationManager
响应序列化程序设置为HTTPResponseSerializer
解决了问题。
<强>目标C 强>
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
<强>夫特强>
manager.responseSerializer = AFHTTPResponseSerializer()
进行此更改意味着我不需要为每个请求添加acceptableContentTypes
。
答案 2 :(得分:71)
我将@jaytrixz的答案/评论更进一步,并将“text / html”添加到现有的类型集中。这样当他们将它在服务器端修复为“application / json”或“text / json”时,我声称它将无缝地工作。
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
答案 3 :(得分:32)
在服务器端,我添加了:
header('Content-type: application/json');
进入我的.php代码,这也解决了问题。
答案 4 :(得分:17)
我从不同的角度解决了这个问题。
我认为如果服务器发送带有Content-Type: text/html
标头的JSON数据。它并不意味着服务器人员打算向您发送一些HTML,但意外地更改为JSON。这确实意味着服务器人员并不关心Content-Type
标头是什么。因此,如果服务器人员不关心客户端,您最好也忽略Content-Type
标头。忽略Content-Type
AFNetworking
标头检查
manager.responseSerializer.acceptableContentTypes = nil;
通过这种方式,AFJSONResponseSerializer
(默认值)将序列化JSON数据,而不检查响应头中的Content-Type
。
答案 5 :(得分:7)
启用接收“text / plain”内容类型的简单方法:
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
同样,如果您希望启用“text / html”内容类型:
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
答案 6 :(得分:5)
我根据@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;
希望这会帮助那些人。
答案 7 :(得分:3)
这是我发现的唯一工作
-(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);
}];
}
答案 8 :(得分:3)
如果有人使用AFHTTPSessionManager
,那么可以这样做来解决问题,
我将AFHTTPSessionManager
子类化,我正在这样做,
NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes];
[contentTypes addObject:@"text/html"];
self.responseSerializer.acceptableContentTypes = contentTypes;
答案 9 :(得分:3)
只需添加以下行:
operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
答案 10 :(得分:2)
在我的情况下,我无法控制服务器设置,但我知道它期望“Content-Type”的“application / json”。我是在iOS客户端做到的:
manager.requestSerializer = [AFJSONRequestSerializer serializer];
答案 11 :(得分:0)
我在Swift代码库中使用AFNetworking时遇到了类似的问题,所以我只是把它放在远程的情况下,有人像我不得不在这样的设置中工作一样不吉利。 如果你是,我觉得你好,保持坚强!
由于&#34;不可接受的内容类型&#34;操作失败,尽管我实际上设置的acceptableContentTypes
的{{1}}包含有问题的内容类型值。
我的解决方案是调整Swift代码,使其更符合Objective-C,我想:
Set
答案 12 :(得分:0)
一个好的问题总是有多个答案,减少并帮助你选择正确的答案,在这里我也加入了自己的答案。我测试了它,它工作正常。
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);
}];
答案 13 :(得分:-1)
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);
}];