请求失败:不可接受的内容类型:使用AFNetworking 2.0的text / html


205

我正在试用新版本的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。

Answers:


361

这意味着您的服务器正在发送"text/html"而不是已经支持的类型。我的解决办法是添加"text/html"acceptableContentTypesAFURLResponseSerialization类。只需搜索“ acceptableContentTypes”并@"text/html"手动添加到集合中即可。

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


142
谢谢!我只是添加了以下代码以使其起作用:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz 2013年

13
对于PHP,就像将其添加到页面一样简单:header(“ Content-Type:application / json”); (除非它不是JSON响应,否则不是XML或其他内容)
rckehoe 2013年

1
@rckehoe谢谢您-相比于更改页面标题,它更可取acceptableContentTypes:)
尼克

43
@jaytrixz注释的替代方法是仅向现有的内容类型添加新的内容类型:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia 2014年

11
迅捷代码:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam 2014年

178

设置我的RequestOperationManager响应序列化程序来HTTPResponseSerializer解决此问题。

物镜

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

迅速

manager.responseSerializer = AFHTTPResponseSerializer()

进行此更改意味着我无需添加acceptableContentTypes到我提出的每个请求中。


2
我做到了,它崩溃了我的应用程序。恢复使用AFJSONResponseSerializer
jaytrixz 2013年

2
@jaytrixz这取决于,如果您的服务器始终以JSON响应,则应将设置responseSerializerAFJSONResponseSerializer
Danpe

2
现在,您将以NSData形式接收responseObject,并且需要在成功块中解析JSON。
卡梅隆·洛厄尔·帕尔默

1
因为我使用的是豆荚,所以这种方法更好。
yong ho 2014年

@Danpe,如何将上述代码行转换为Swift。我尝试使用manager.responseSerializer = AFJSONResponseSerializer.serializer(),但没有用。
2015年

72

我将@jaytrixz的答案/评论更进一步,并将“ text / html”添加到现有的类型集中。这样,当他们在服务器端将其修复为“ application / json”或“ text / json”时,我声称它将无缝运行。

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

2
同意 这个问题的公认答案有一个很大的缺陷,那就是它会创建一个定时炸弹,当固定服务器端以返回正确的内容类型时,该炸弹将爆炸。
埃里克·戈德堡

从理论上讲这似乎是正确的,但是有人实际测试过吗?
Minimi

32

在服务器端,我添加了:

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

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


3
if(!headers_sent() ) { header('Content-Type: application/json'); } 是一个不错的解决方法
elliotrock

17

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

我认为服务器是否发送带有Content-Type: text/html标头的JSON数据。这并不意味着服务器人员打算向您发送一些html,但不小心将其更改为JSON。这确实意味着服务器人员根本不在乎Content-Type标头是什么。因此,如果服务器端不在乎客户端,则最好也忽略Content-Type标头。忽略Content-Type标头签入AFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

通过这种方式AFJSONResponseSerializer(默认值)将序列化JSON数据,而无需检Content-Type入响应头。


完全正确。通过忽略内容类型,我不会以十六进制代码或失败的nil响应形式接收我的内容。这很棒!谢谢
布兰登2015年

7

一种启用接收“文本/纯文本”内容类型的简单方法:

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

同样,如果您希望启用“ text / html”内容类型:

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

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;

希望这会对外面的人有所帮助。


1
+1。这绝对是解决方案。由于您必须在序列化程序(如果它是JSON序列化程序(通常使用“ application / json”))上设置可接受的“内容类型”,并且还要设置操作。否则,您只会在操作时得到错误设置。
loretoparisi

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

3

如果有人在使用,AFHTTPSessionManager则可以这样做来解决问题,

AFHTTPSessionManager把我这样做的地方归类

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

2

就我而言,我无法控制服务器设置,但是我知道它期望“ Content-Type”使用“ application / json”。我是在iOS客户端上执行此操作的:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

请参阅 AFNetworking版本2内容类型错误


1

只需添加以下行:

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

0

我在Swift代码库中使用AFNetworking时遇到了类似的问题,因此我只是在远程情况下将此问题留在这里,因为有人像我这样不幸地在这种设置中工作。如果你是,我觉得你是哥们,保持坚强!

尽管我实际上将设置acceptableContentTypesSet包含所涉及的内容类型值的操作,但由于“不可接受的内容类型”,操作失败。

我的解决方案是调整Swift代码,使其对Objective-C更友好,我猜

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

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

-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);
 }];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.