AFNetworking 2 响应错误(内容类型:文本/html 而非 JSON)

Posted

技术标签:

【中文标题】AFNetworking 2 响应错误(内容类型:文本/html 而非 JSON)【英文标题】:AFNetworking 2 Response Error (Content type: text/html and not JSON) 【发布时间】:2014-01-14 16:37:19 【问题描述】:

在尝试了几乎所有关于该主题的回复后,我都没有找到解决问题的有效答案。

问题:所以我在从AFNetworking 1.3 移植后使用AFNetworking 2.0.3 实现了我的应用程序的上传部分:

-(void)commandWithParams:(NSMutableDictionary*)params onCompletion:(JSONResponseBlock)completionBlock 

    NSData* uploadFile = nil;
if ([params objectForKey:@"file"]) 
    uploadFile = (NSData*)[params objectForKey:@"file"];
    [params removeObjectForKey:@"file"];


 AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://54.204.17.38"]];

 manager.responseSerializer = [AFJSONResponseSerializer serilizer];
 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];

 AFHTTPRequestOperation *apiRequest = [manager POST:@"/API" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 

     if (uploadFile) 
         [formData appendPartWithFileData:uploadFile name:@"file" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
     

 success:^(AFHTTPRequestOperation *operation, id responseObject) 
    completionBlock(responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
];

[apiRequest start];

我在使用此代码时遇到的错误是“请求失败:不可接受的内容类型:text/html”在我的浏览器中检查了“MIME type: application/json”的响应标头之后。另外,我也在我的 API 顶部使用了 'header('Content-type: application/json')'(php API)。现在,如果我将序列化类型更改为“AFHTTPResponseSerializer”而不是“AFJSONResponseSerializer”,它不会吐出JSON error,但它会给我一个不同的错误(随机无法识别的选择器错误)。

对于为什么我似乎无法通过这种方法获得JSON 响应有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以将AFHTTPSessionManager 设置为接受任何 MIME 类型:

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

【讨论】:

添加这个允许响应通过,但我现在得到一个新错误:Cocoa 错误 3840(我认为这意味着输入 JSON 无效)。我不确定为什么在验证 JSON 时它认为我的 JSON 无效 并响应您的修复...是的,它有效,但随后它破坏了我的应用程序执行的下一部分 - 当有人 ttys 登录时,我无法解析 API 响应 bc 它不是 json :( 我还通过 chrome 的 XHRposter 插件验证了 Web API 正在返回“Content-Type application/json”。任何想法或线索???【参考方案2】:

知道了!因此,结果在不知不觉中,尽管我的 API 返回了有效的 JSON,但检查头响应记录在 Xcode 方面的问题(通过 NSLog(@"Error: %@", error);) ,它实际上返回了文本/HTML,因为它没有实际上点击正确的文件,它被某个地方的标题重新路由。在明确声明 API 路径为 /API/index.php 而不仅仅是 /API 之后,它开始返回有效的 JSON!接下来,在确保响应被正确地 JSON 序列化后(使用 requestManager.responseSerializer = [AFJSONResponseSerializer serializer];),应用程序工作了!

希望这可以帮助遇到同样问题的人:)

【讨论】:

以上是关于AFNetworking 2 响应错误(内容类型:文本/html 而非 JSON)的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2 setImageWithURL 自定义响应类型 image/jpeg

使用 AFNetworking 获取 OMDb API 数据

AFNetworking 和 POST 请求

“请求失败:不可接受的内容类型:文本/html”使用 AFNetworking 2.0

从 AFNetworking 检索错误响应

AFNetworking 2.0 - “不可接受的内容类型:文本/纯文本”