AFNetworking 2.0 - "unacceptable content-type: text/plain"



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

节点正在发送 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}

我可以卷曲 (-i) 网址http://localhost:3000/api/v1/log/newest并获取我期望的数据,并且它是预期的应用程序/json。如果我在 Web 浏览器中加载该数据,我会按开发工具检查器的预期获得 JSON。

但是使用AFNetworking,我得到了这个神秘的"不可接受的内容类型:文本/纯文本"错误。知道吗?

注意:我以前从未使用过AFNetworking,所以我可能用错了。

似乎服务器正在发送"text/html",默认情况下不支持此类型。为"可接受的内容类型"添加@"text/html"

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

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

为我工作。

为我工作。

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

按照@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;

只需使用:

.SWIFT:

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

OBJ-C:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
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];

为我工作

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>

相关内容

最新更新