【问题标题】:Request failed: unacceptable content-type: text/html using AFNetworking 2.0请求失败:不可接受的内容类型:使用 AFNetworking 2.0 的 text/html
【发布时间】:2013-10-07 12:29:45
【问题描述】:

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

【问题讨论】:

    标签: ios afnetworking afnetworking-2


    【解决方案1】:

    一个好问题总是有多个答案,为了减少和帮助你选择正确的答案,我在这里也添加我自己的。我已经测试过了,效果很好。

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

    【讨论】:

      【解决方案2】:

      我在使用 Swift 代码库中的 AFNetworking 时遇到了类似的问题,所以我只是把它留在这里,因为有人像我一样不幸不得不在这样的设置中工作。 如果你是,我觉得你是哥们,保持坚强!

      尽管我实际上使用包含相关内容类型值的 Set 设置了 acceptableContentTypes,但由于“不可接受的内容类型”而导致操作失败。

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

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

      【讨论】:

        【解决方案3】:

        将我的RequestOperationManager 响应序列化程序设置为HTTPResponseSerializer 解决了这个问题。

        Objective-C

        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        

        斯威夫特

        manager.responseSerializer = AFHTTPResponseSerializer()
        

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

        【讨论】:

        • 我做了这个,它使我的应用程序崩溃。恢复使用AFJSONResponseSerializer
        • @jaytrixz 这取决于,如果您的服务器总是以 JSON 响应,您应该将 responseSerializer 设置为 AFJSONResponseSerializer
        • 您现在将收到作为 NSData 的 responseObject 并且需要在成功块中解析 JSON。
        • 因为我用的是pod,所以这种方式比较好。
        • @Danpe,如何将上述代码行转换为 Swift。我试过 manager.responseSerializer = AFJSONResponseSerializer.serializer() 但没用。
        【解决方案4】:

        我按照@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。这绝对是解决方案。如果这是 JSON 序列化程序(通常使用“application/json”)和操作,则必须在序列化程序上设置可接受的内容类型。否则只会在操作时得到错误设置。
        【解决方案5】:

        只需添加这一行:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 谢谢!我刚刚添加了这段代码以使其工作:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
          • 对于 PHP,只需将其添加到页面中即可: header("Content-Type: application/json"); (除非不是 JSON 响应,然后是 XML 什么的)
          • @rckehoe 谢谢你 - 比起acceptableContentTypes 更喜欢更改页眉:)
          • @jaytrixz 评论的替代方法是向现有内容类型添加一个新内容类型:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
          • 斯威夫特代码:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
          【解决方案7】:

          我从不同的角度解决了这个问题。

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

          manager.responseSerializer.acceptableContentTypes = nil;
          

          这样AFJSONResponseSerializer(默认)将序列化JSON数据而不检查响应头中的Content-Type

          【讨论】:

          • 完全正确。通过忽略内容类型,我不会将我的内容作为十六进制代码接收,也不会作为失败的 nil 响应接收。这很好用!谢谢
          【解决方案8】:

          启用接收“text/plain”内容类型的简单方法:

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

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

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

          【讨论】:

            【解决方案9】:

            就我而言,我无法控制服务器设置,但我知道“Content-Type”需要“application/json”。我是在 iOS 客户端这样做的:

            manager.requestSerializer = [AFJSONRequestSerializer serializer];
            

            参考 AFNetworking version 2 content-type error

            【讨论】:

              【解决方案10】:

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

              我将 AFHTTPSessionManager 子类化,我正在这样做,

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

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  【解决方案12】:
                   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);
                   }];
                  

                  【讨论】:

                    【解决方案13】:

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

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

                    【讨论】:

                    • 同意。这个问题的公认答案有一个巨大的缺陷,它会创建一个定时炸弹,当服务器端修复为返回正确的内容类型时会爆炸。
                    • 这在理论上似乎是正确的,但有人实际测试过吗?
                    【解决方案14】:

                    在服务器端,我补充说:

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

                    进入我的 .php 代码,这也解决了问题。

                    【讨论】:

                    • if(!headers_sent() ) { header('Content-Type: application/json'); } 是一个不错的解决方案
                    猜你喜欢
                    • 2015-02-12
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-01-06
                    • 2014-06-14
                    • 2016-09-27
                    • 1970-01-01
                    • 2014-01-15
                    • 1970-01-01
                    相关资源
                    最近更新 更多