AFNetworking版本2内容types错误

我试图做一个iphone应用程序,将与特定的JIRA服务器进行交互。 我有以下代码login:

NSURL *url = [[NSURL alloc] initWithString:@"https://mycompany.atlassian.net/rest/auth/latest/session/"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; NSString *postString = [NSString stringWithFormat:@"{\"username\":\"%@\",\"password\":\"%@\"}", username, password]; [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept" ]; operation.responseSerializer = [AFJSONResponseSerializer serializer]; [operation setCompletionBlockWithSuccess: ^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"ERROR: %@", error); } ]; [operation start]; 

但是,它给了我以下的内容types的错误:

 ERROR: Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: unsupported media type (415)" UserInfo=0x8cd6540 { NSErrorFailingURLKey=https://mycompany.atlassian.net/rest/auth/latest/session/, NSLocalizedDescription=Request failed: unsupported media type (415), NSUnderlyingError=0x8c72e70 "Request failed: unacceptable content-type: text/html", 

我不确定是什么问题。 我发现这个问题 ,我认为这可能是一个类似的问题,但答案要么使用AFJSONRequestOperation类(我不能因为我使用AFNetworking版本2,它没有那个类),或修复它在服务器端(我也不能明显的原因)。

当我无法修复服务器端,我不能使用AFJSONRequestOperation

如果使用AFNetworking 2.0,您可以使用POST方法,这简化了这一点:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; NSDictionary *parameters = @{@"username":username, @"password":password}; [manager POST:@"https://mycompany.atlassian.net/rest/auth/latest/session/" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

这将创build请求,根据requestSerializer设置设置其Content-Type ,并为您编码JSON。 AFNetworking的优点之一是你可以摆脱构build和手动configurationNSURLRequest对象的杂草。


顺便说一下,“请求失败:不可接受的内容types:文本/ HTML”错误意味着,无论您希望得到什么(例如JSON),您收到HTML响应。 这是很常见的:许多服务器错误(例如服务器通知您请求格式错误等)会生成HTML错误消息。 如果你想在你的failure块中看到这个HTML,只需loginoperation.responseString

原来问题是这一行:

 [request setValue:@"application/json" forHTTPHeaderField:@"Accept" ]; 

应该

 [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type" ]; 

错误现在已经解决了。 ( 编辑 :我应该都有,请参阅CouchDeveloper的评论。)

编辑
罗布的解决scheme是更好的,所以我要去。 我实际上已经尝试过类似的解决scheme,但他在哪里,

 manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

我有线:

 [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

…没有工作。 荣获罗布得到它的工作!

我在AFNetworking 2.0有同样的问题,解决scheme是,我必须确保我设置AFHTTPRequestSerializertypes(如果您的请求是JSON),它应该是这样的。

 AFHTTPSessionManager *myHTTPManager = ... [myManager setRequestSerializer:[AFJSONRequestSerializer serializer]]; 

您必须设置AFHTTPResponseSerializerAFHTTPRequestSerializer

如果您正在使用默认书面类AFAppDotNetAPIClient,并且您面临此错误。 必须添加responseSerializer 。 看看你的共享方法应该看起来像 –

 + (instancetype)sharedClient { static AFAppDotNetAPIClient *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[AFAppDotNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:AFAppDotNetAPIBaseURLString]]; _sharedClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; _sharedClient.responseSerializer = [AFHTTPResponseSerializer serializer]; }); return _sharedClient;} 

使用这一行代码。

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