使用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)"}
答案 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/html
或text/plain
,它是' s AFNetworking 2
AFJSONResponseSerializer
不接受;它只接受MIME类型等于JSON(例如application/json
)。
因此,为了解决这个问题,在failure
块中,您可以检测到此类错误和相关的显示错误消息。