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

jay*_*ixz 201 ios afnetworking afnetworking-2

我正在尝试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];
Run Code Online (Sandbox Code Playgroud)

我正在使用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}
Run Code Online (Sandbox Code Playgroud)

我只是使用kJSONlink隐藏了JSON.这应该返回一个JSON.

And*_*eag 358

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

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

  • 谢谢!我刚刚添加了这段代码以使其工作:`op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];` (140认同)
  • @jaytrixz注释的替代方法是只添加一个新的内容类型到现有的内容类型:`op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];` (43认同)
  • 对于PHP来说,就像将它添加到页面一样简单:header("Content-Type:application/json"); (除非它不是JSON响应,然后是XML或其他东西) (13认同)
  • Swift代码:`op.responseSerializer.acceptableContentTypes = NSSet(object:"text/html")` (11认同)

Dan*_*npe 178

设置我的RequestOperationManagerResponse Serializer来HTTPResponseSerializer解决问题.

Objective-C的

manager.responseSerializer = [AFHTTPResponseSerializer serializer];
Run Code Online (Sandbox Code Playgroud)

迅速

manager.responseSerializer = AFHTTPResponseSerializer()
Run Code Online (Sandbox Code Playgroud)

进行此更改意味着我不需要添加acceptableContentTypes每个请求.

  • 我做了这个,它崩溃了我的应用程序.恢复使用`AFJSONResponseSerializer` (2认同)
  • @jaytrixz这取决于,如果你的服务器总是用JSON响应你应该将`responseSerializer`设置为`AFJSONResponseSerializer`. (2认同)
  • 您现在将接收responseObject作为NSData,并需要在成功块中解析JSON. (2认同)

mha*_*per 71

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

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
Run Code Online (Sandbox Code Playgroud)

  • 同意.这个问题的公认答案有一个巨大的缺陷,即它会创建一个定时炸弹,当服务器端被修复以返回正确的内容类型时,它会爆炸. (2认同)

Chr*_*nce 32

在服务器端,我补充说:

header('Content-type: application/json');
Run Code Online (Sandbox Code Playgroud)

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

  • `if(!headers_sent()){header('Content-Type:application/json'); }是一个很好的解决方案 (3认同)

dop*_*pcn 17

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

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

manager.responseSerializer.acceptableContentTypes = nil;
Run Code Online (Sandbox Code Playgroud)

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


da *_*res 7

一种简单的方法,可以接收"text/plain"内容类型:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
Run Code Online (Sandbox Code Playgroud)

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

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
Run Code Online (Sandbox Code Playgroud)


ABS*_*ABS 5

按照@Andrie的回答,我在下面试过但是没有用,

op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
Run Code Online (Sandbox Code Playgroud)

所以在狩猎之后,我确实努力让它成功运作.

这是我的代码片段.

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;
Run Code Online (Sandbox Code Playgroud)

希望这会帮助那里的人.