我正在尝试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。


当前回答

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

我认为如果服务器发送带有Content-Type: text/html头的JSON数据。这并不意味着服务器人员打算向你发送一些html,但不小心将其更改为JSON。这意味着服务器并不关心Content-Type报头是什么。所以如果服务器端不关心客户端,你最好也忽略Content-Type头。忽略AFNetworking中的Content-Type头检查

manager.responseSerializer.acceptableContentTypes = nil;

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

其他回答

这意味着您的服务器正在发送“text/html”而不是已经支持的类型。 我的解决方案是添加“文本/html”到acceptableContentTypes设置在AFURLResponseSerialization类。只需搜索“acceptableContentTypes”,并手动添加@“text/html”到集合。

当然,理想的解决方案是改变从服务器发送的类型,但为此您必须与服务器团队讨论。

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

objective - c

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

斯威夫特

manager.responseSerializer = AFHTTPResponseSerializer()

做这个更改意味着我不需要为我发出的每个请求添加acceptableContentTypes。

这是我发现的唯一有效的方法

-(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);
    }];
}

我按照@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;

希望这能帮助到一些人。

如果有人使用afhttpessionmanager,那么可以这样做来解决问题,

我子类afhttpessionmanager,我这样做,

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