AFNetworking 2.0 - “不可接受的内容类型:文本/纯文本”

Posted

技术标签:

【中文标题】AFNetworking 2.0 - “不可接受的内容类型:文本/纯文本”【英文标题】:AFNetworking 2.0 - "unacceptable content-type: text/plain" 【发布时间】:2014-01-15 11:20:30 【问题描述】:

我正在使用 AFNetworking 2.0 从我正在 Node.js 中构建的服务中读取 JSON(目前在 localhost 上)。很正常的东西。

节点像这样发送 JSON:

res.setHeader('Content-Type','application/json');
res.end( JSON.stringify(...));

我的 ios 首次通过代码正在尝试读取该数据,如下所示:

typedef void(^NextBlock)();
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager GET:self.newestTimestampURL.absoluteString
    parameters:nil
    success:^(AFHTTPRequestOperation *operation, id responseObject)
    
        //NSDictionary *response =
        NSLog(@"got %@", responseObject );
    
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    
        NSLog(@"fail %@", error );
    ];

这是我得到的错误:

Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/plain" UserInfo=0xb783e30 NSErrorFailingURLKey=http://localhost:3000/api/v1/log/newest, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xb656a70>  URL: http://localhost:3000/api/v1/log/newest   status code: 200, headers 
Connection = "keep-alive";
ContentType = "application/json";
Date = "Fri, 27 Dec 2013 20:58:50 GMT";
"Transfer-Encoding" = Identity;
 , NSLocalizedDescription=Request failed: unacceptable content-type: text/plain

我可以 curl (-i) url http://localhost:3000/api/v1/log/newest 并获取我期望的数据,它是预期的 application/json。如果我在我的网络浏览器中加载该数据,我会按照开发工具检查器的预期获得 JSON。

但是使用 AFNetworking,我得到了这个神秘的“不可接受的内容类型:文本/纯文本”错误。有什么想法吗?

注意:我以前从未使用过 AFNetworking,所以我可能使用不正确。

【问题讨论】:

如果你 curl 带有 -I 标志来获取标题。此时响应是否获得了正确的内容类型标头? 当我 curl -I 我得到以下信息:HTTP/1.1 200 OK ContentType: application/json Date: Sat, 28 Dec 2013 14:26:04 GMT Connection: keep-alive 不应该是Content-Type带连字符吗? 哦,天哪。谢谢!我曾认为我的客户端代码有问题,但这是节点 JS 代码中的错字。非常感谢!圣诞奇迹! 【参考方案1】:

好像服务器在发送“text/html”,默认不支持这种类型。为“acceptableContentTypes”添加@“text/html”

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

【讨论】:

【参考方案2】:

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

为我工作。

【讨论】:

也适用于我,我使用过manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];,但它对我没有帮助。但是您的解决方案有效。【参考方案3】:

只需使用:

斯威夫特:

manager.responseSerializer.acceptableContentTypes = NSSet(object: "text/plain") as Set<NSObject>

OBJ-C:

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

【讨论】:

***.com/questions/42573527/…【参考方案4】:
NSURL *url = [NSURL URLWithString:RSS_WORLD_NEWS];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

// Make sure to set the responseSerializer correctly
operation.responseSerializer = [AFXMLParserResponseSerializer serializer];

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/rss+xml"];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 

    NSXMLParser *XMLParser = (NSXMLParser *)responseObject;
    [XMLParser setShouldProcessNamespaces:YES];

     XMLParser.delegate = self;
     [XMLParser parse];

 failure:^(AFHTTPRequestOperation *operation, NSError *error) 

    [MBProgressHUD hideHUDForView:self.view animated:YES];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving contents"
                                                        message:[error localizedDescription]
                                                       delegate:nil
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];

];

[operation start];

为我工作

【讨论】:

【参考方案5】:

我已按照@KIO 发布的答案进行操作,但它在我的场景中不起作用。

在回答了很多问题后,我找到了适合我的解决方案。

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;

【讨论】:

这是唯一对我有用的。它没有破坏现有的 json 类型,并且可以轻松适应以包含更多类型。谢谢。【参考方案6】:

为我工作。

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

【讨论】:

这可行,但不是一个糟糕的解决方案,因为它不会将“text/plain”添加到可接受的类型列表中,而是替换它,这意味着其他有效类型 - 如“application/json”将不再工作。 ABS 提供了更正确(和完整)的答案。【参考方案7】:

更新了 Swift 解决方案。

如果你在 Swift 中使用 AFNetworking。那么这个解决方案可能会对你有所帮助。它将接受大多数内容类型。

let manager=AFHTTPRequestOperationManager()

            manager.responseSerializer = AFJSONResponseSerializer(readingOptions: NSJSONReadingOptions.AllowFragments) as AFJSONResponseSerializer

            manager.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer

            manager.responseSerializer.acceptableContentTypes = NSSet(objects:"application/json", "text/html", "text/plain", "text/json", "text/javascript", "audio/wav") as Set<NSObject>

【讨论】:

以上是关于AFNetworking 2.0 - “不可接受的内容类型:文本/纯文本”的主要内容,如果未能解决你的问题,请参考以下文章

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

AFNetworking 总是返回不可接受的内容类型:text/html

请求失败:不可接受的内容类型:使用 AFNetworking 2.5 的图像/jpg

从 AFNetworking 1.3 迁移到 AFNetworking 2.0 的问题

AFNetworking 2.0 JSON 解析

AFNetworking 2.0 对现有项目的更新