Ошибка ответа AFNetworking 2 (тип содержимого: text/html, а не JSON)

Попробовав почти каждый ответ по этому вопросу, я не нашел рабочего ответа на свою проблему.

Проблема: поэтому я реализовал часть загрузки своего приложения, используя AFNetworking 2.0.3 после переноса с AFNetworking 1.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];

}

Ошибка, которую я получаю при использовании этого кода: «Ошибка запроса: неприемлемый тип контента: текст/html». Я знаю, что вам может быть интересно, отвечает ли сервер правильным JSON, и у меня есть все основания думать, что это так после проверки ответа заголовки в моем браузере, которые говорят «MIME type: application/json». Кроме того, я использую 'header('Content-type: application/json')' в верхней части моего API (PHP API). Теперь, если я изменю тип сериализации на «AFHTTPResponseSerializer» вместо «AFJSONResponseSerializer», он не выдаст JSON error, но выдаст другую ошибку (случайная нераспознанная ошибка селектора).

Любые мысли о том, почему я не могу получить ответ JSON из этого метода?


person Nochbag    schedule 27.12.2013    source источник


Ответы (2)


Вы можете установить AFHTTPSessionManager для принятия любого типа MIME:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
person guru    schedule 27.12.2013
comment
Добавление этого позволяет пройти ответ, но теперь я получаю новую ошибку: ошибка Cocoa 3840 (что, я думаю, означает, что ввод JSON недействителен). Я не уверен, почему он считает, что мой JSON недействителен, когда он проверен JSON - person Nochbag; 27.12.2013
comment
И чтобы отреагировать на ваше исправление… да, это работает, но затем нарушается следующая часть выполнения моего приложения — когда кто-то пытается войти в систему, я не могу проанализировать ответ API, потому что это не json :( Я' Мы также проверили, что веб-API возвращает приложение Content-Type/json через плагин XHRposter для Chrome.Есть идеи или подсказки??? - person Nochbag; 27.12.2013

Понятно! Итак, оказывается, по незнанию, хотя мой API возвращал действительный JSON, важно проверить ответ заголовка, зарегистрированный на стороне Xcode (через NSLog(@"Error: %@", error);) , он фактически возвращал текст/HTML, потому что он на самом деле попадал не в правильный файл, он куда-то перенаправлялся заголовком. После явного указания пути к API /API/index.php, а не просто /API, он начал возвращать действительный JSON! Затем, убедившись, что ответ был правильно сериализован JSON (используя requestManager.responseSerializer = [сериализатор AFJSONResponseSerializer];), приложение заработало!

Надеюсь, это поможет кому-то, у кого была такая же проблема :)

person Nochbag    schedule 27.12.2013