AFNetworking 2.0:NSLocalizedDescription=请求失败:不可接受的内容类型:文本/html

Posted

技术标签:

【中文标题】AFNetworking 2.0:NSLocalizedDescription=请求失败:不可接受的内容类型:文本/html【英文标题】:AFNetworking 2.0: NSLocalizedDescription=Request failed: unacceptable content-type: text/html 【发布时间】:2014-02-07 06:02:22 【问题描述】:

我尝试从 Apple 主页 GET html

AFHTTPRequestOperationManager *manager
= [AFHTTPRequestOperationManager manager];
[manager GET:@"http://www.apple.com/jp" parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"HTML: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

这失败了,错误信息如下:

2014-02-07 14:54:22.922 Tests[1833:70b] Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0x8a32650 NSErrorFailingURLKey=http://www.apple.com/jp/, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xea2e1a0>  URL: http://www.apple.com/jp/   status code: 200, headers 
    "Accept-Ranges" = bytes;
    "Cache-Control" = "max-age=237";
    Connection = "keep-alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 4402;
    "Content-Type" = "text/html; charset=UTF-8";
    Date = "Fri, 07 Feb 2014 05:52:51 GMT";
    Expires = "Fri, 07 Feb 2014 05:56:48 GMT";
    Server = Apache;
    Vary = "Accept-Encoding";
    Via = "1.0 proxy1.screen.co.jp (squid)";
    "X-Cache" = "MISS from proxy1.screen.co.jp";
    "X-Cache-Lookup" = "HIT from proxy1.screen.co.jp:8080";
 , NSLocalizedDescription=Request failed: unacceptable content-type: text/html

我找到了Request failed: unacceptable content-type: text/html 的消息,所以我知道我必须让 text/html 可以接受。然后,我添加了这一行:manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

AFHTTPRequestOperationManager *manager 
= [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes
= [NSSet setWithObject:@"text/html"]; // ###### ADDED LINE ######
[manager GET:@"http://www.apple.com/jp" parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"HTML: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

但这也失败了。

2014-02-07 14:55:48.927 Tests[1873:70b]
Error: Error Domain=NSCocoaErrorDomain Code=3840
"The operation couldn’t be completed. (Cocoa error 3840.)"
(JSON text did not start with
array or object and option to allow fragments not set.)
UserInfo=0xfa7b870 NSDebugDescription=
JSON text did not start with
array or object and option to allow fragments not set.

感谢您的帮助。

【问题讨论】:

【参考方案1】:

问题在于AFHTTPRequestOperationManager 默认为responseSerializerAFJSONResponseSerializer。通过更改 acceptableContentTypes,您正在更改将接受哪些内容类型,但您并没有改变 AFJSONResponseSerializer 仍将在响应中查找 JSON 的事实。

您可能只想将responseSerializer 设置为AFHTTPResponseSerializer,这样它就不会再尝试解析JSON(并且会自动接受text/html):

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

【讨论】:

我还要换行:NSLog(@"HTML: %@", [responseObject stringValue]); 我找到了更简单的方法:NSError* error = [[NSError alloc] init];NSString* content = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.apple.co.jp/"] encoding:NSUTF8StringEncoding error:&amp;error];我不必使用AFNetworking... @weed 没关系,如果这对你有用,但请注意这是一个同步调用,你不应该在主线程中进行。如果您将此代码分派到后台队列,那没关系(但仍然失去了 AFNetworking 或基于委托的 NSURLConnection 的一些好处,例如可取消的请求)。最重要的是,如果您不想使用 AFNetworking,请不要使用,但我讨厌看到您将婴儿与洗澡水一起扔出去。 谢谢你的建议,罗布。我要试试AFNetworking。 我想你搞定了兄弟!太感谢了!嘿,所以我必须将 responseSerializer 更改为以前的值吗?【参考方案2】:

我刚刚尝试使用 wget,并以“jp”结尾给出了 301 重定向。

尝试以“jp/”结尾。

【讨论】:

以上是关于AFNetworking 2.0:NSLocalizedDescription=请求失败:不可接受的内容类型:文本/html的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 对现有项目的更新

AfNetworking 2.0 发布问题

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?

Afnetworking 2.0 发布方法错误

AFNetworking 2.0 和请求标头

Afnetworking 2.0 参数编码