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

时间:2014-04-28 20:29:01

标签: ios objective-c ios7 afnetworking-2

使用AFNetworiking 2的请求时出现问题。

我的sharedInstance类方法中有AFHTTPSessionManager自定义sharedInstance

sharedInstance.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:3];
sharedInstance.responseSerializer.acceptableContentTypes = [sharedInstance.responseSerializer.acceptableContentTypes setByAddingObject:@"text/plain"];
sharedInstance.responseSerializer.acceptableContentTypes = [sharedInstance.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

这是因为我的服务器用text / plain响应(仅在出错时 - 成功时用jsons响应)

但即使我发送POST方法,我也会收到此错误:

failure: 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=0x175e6970 {NSDebugDescription=JSON text did not start with array or object
and option to allow fragments not set., NSUnderlyingError=0x175e59b0 "Request failed:
internal server error (500)"}

我已经阅读了问题:thisthis以及网络上的更多内容,但没有好的答案。有什么想法吗?

6 个答案:

答案 0 :(得分:2)

尝试这样的事情:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:url]];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

答案 1 :(得分:2)

使用swift试试这个

manager.responseSerializer.acceptableContentTypes = nil

答案 2 :(得分:1)

内部服务器错误(500)基本上意味着您的服务器无法成功处理此请求,但会出错。 (您可能希望在此处公开部分服务器代码以获得更多帮助)。 根据您的问题,我了解如果出现错误,服务器会以text / plain回答。 我想你的代码引发了这个错误(JSON文本没有以数组开头......),因为你试图将响应解析为JSON(即使在没有错误的情况下也是如此),即使在500错误的情况下也是如此。

您可能想要共享其余的客户端代码。 纠正服务器端问题会有所帮助,但不会导致错误情况的正确客户端代码逻辑。

如果您需要访问Http错误代码,请查看此处:is there an easy way to get the http status code in the failure block from AFHTTPClient?

可能类似于您的问题:AFNetworking 2.0: NSLocalizedDescription=Request failed: unacceptable content-type: text/html

答案 3 :(得分:1)

对于OC,我通过这种方式解决了问题

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = nil;

希望这会有所帮助。

答案 4 :(得分:0)

昨天刚刚经历了类似的事情!

这就是我的所作所为。

转到你的afnetworking课程,然后转到AFURLResponseSerializer.m。

找到此方法,然后确保它具有NSJSONReadingAllowFragments。

+ (instancetype)serializer {
    return [self serializerWithReadingOptions:(NSJSONReadingOptions)NSJSONReadingAllowFragments];
}

尝试再次运行它,您可能会收到另一个错误,字符0周围的值无效。

所以是的,你的服务器是公牛,它给垃圾json。

你可以检查一下!

所以在你失败的可能性中:

NSLog("%@", operation.responseString);

大多数服务器在回复中都说是否成功,无论如何都是我的。

所以在下面搜索responseString for Success。

(失败:)

 if ([operation.responseString containsString:@"SUCCESS"]) {                 
//true success
} else {              
NSLog(@"Error: %@", error);
//true failure
}

答案 5 :(得分:0)

令人惊讶的是,这个问题没有完整的答案,而@blackbox非常接近。

首先,正如@blackbox所说,作为服务器响应 500内部服务器错误,默认情况下可能会显示为text/htmltext/plain,它是' s AFNetworking 2 AFJSONResponseSerializer不接受;它只接受MIME类型等于JSON(例如application/json)。

因此,为了解决这个问题,在failure块中,您可以检测到此类错误和相关的显示错误消息。