4

我正在尝试制作一个与特定 JIRA 服务器交互的 iphone 应用程序。我有以下代码可以登录:

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];

但它给了我以下与 Content-Type 相关的错误:

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

4

5 回答 5

14

如果使用 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);
}];

这会创建请求,Content-Type根据设置对其进行requestSerializer设置,并为您编码 JSON。AFNetworking 的优点之一是您可以摆脱NSURLRequest手动构建和配置对象的麻烦。


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

于 2014-01-23T23:46:43.553 回答
2

事实证明,问题在于这一行:

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

应该

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

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

编辑
Rob 的解决方案更好,所以我同意它。实际上,我曾尝试过与他所展示的类似的解决方案,但他的底线是,

manager.requestSerializer = [AFJSONRequestSerializer serializer];

我有这行:

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

......这没有用。感谢 Rob 让它工作!

于 2014-01-23T23:04:24.397 回答
1

我在 AFNetworking 2.0 中遇到了同样的问题,解决方案是我必须确保我设置了 AFHTTPRequestSerializer 类型(如果您的请求是 JSON),它应该是这样的。

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

您必须同时设置AFHTTPResponseSerializerAFHTTPRequestSerializer

于 2014-04-05T13:09:47.057 回答
0

如果您使用默认的书面类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;}
于 2014-07-22T11:45:58.397 回答
0

使用这行代码。

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
于 2015-07-17T09:32:22.413 回答