2012-06-19 2 views
0

У меня есть проблема, чтобы загрузить файл или управлять ошибки в некоторых случаях (JSON)AFNetworking + загрузить файл или JSON ответ + setDownloadProgressBlock

Загрузка работает очень хорошо. Проблема в том, что сервер может отправлять 404 или 200 (с JSON) в нескольких случаях, когда пользователь запрашивает загрузку.

Как обращаться с JSON в этом случае? Когда мы отправляем запрос, мы не знаем, получим ли мы ошибку JSON (с 200 статусом oR 404) или зашифрованным файлом ...

Я не вижу, как responseObject может мне помочь.

Вот мой код:

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:zipPath append:NO]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
    NSLog(@"Successfully downloaded zip file to %@", zipPath); 

    // is-it impossible to handle a JSON response here ? 
    // responseObject can help me ? don't think ! 

    // do what I have to do after the download is complete 
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
    // 404 
    // is-it impossible to handle a JSON response here ? 
    if ([error code] == -1011) 
    { 

    } 
    }]; 

    [operation setDownloadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 
    float progress = ((float)((int)totalBytesWritten)/(float)((int)totalBytesExpectedToWrite)); 
    self.progressView.progress = progress; 
    }]; 
    [operation start]; 

Нужна ли я сделать AFJSOnRequestOperation? Но в этом случае, как получить загруженный файл, который не является JSON? Спасибо за помощь.

EDIT: я wroted в моих комментариях, я могу получить и поймать responseData в успехе блока ТОЛЬКО если я комментирую строку:

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:zipPath append:NO]; 

Это логично, я полагаю, что ответ идет в OutputStream вместо успеха блок. Есть ли решение для этого?

ответ

1

Сервер должен сигнализировать тип MIME в заголовке Content-Type. Если вам не нужно самостоятельно определять тип данных.

Эта линия обеспечивает, чтобы получить все ответы с StatusCode 200-499 в блоке успеха:

[AFHTTPRequestOperation addAcceptableStatusCodes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(300, 200)]]; 

В блоке успеха вам необходимо определить тип ответа:

id jsonObject = AFJSONDecode(operation.responseData, NULL); 
if (jsonObject) { 
    // handle JSON 
} else { 
    // handle zip file 
} 

Вы можете также осмотрите operation.response.statusCode и operation.response.MIMEType заранее.

+0

Hello phix23. Проблема в том, что операция.responseData кажется нулевой, когда я получил ответ JSON вместо файла. И id jsonObject = AFJSONDecode (операция.responseData, NULL); не работает (неявное объявление функции AFJSONDecode недействительно на C99) –

+0

вам нужно использовать AFHTTPRequestOperation, а не AFJSONRequestOperation. Для AFJSONDecode вы должны импортировать AFJSONUtilities.h – Felix

+0

Дополнительная информация. Я могу получить код состояния 200, а приложение/json mineType ..., но responseData - null. Или можете увидеть JSON в моем браузере. –

0

Я попытался с AFJSOnRequestOperation, в .m я просто поставил OutputStream под INIT:

AFJSONRequestOperation *requestOperation = [[[self alloc] initWithRequest:urlRequest] autorelease]; 

requestOperation.outputStream = [NSOutputStream outputStreamToFileAtPath:[FullyLoaded filePathForResourceAtURL:urlRequest.URL.absoluteString] append:NO]; 

И то же самое происходит, responseData равно нулю, если комментируя OutputStream линию, так что это не HTTPRequest или JSONRequest вопрос. Способ, которым я пользуюсь, состоит в том, чтобы JSON упорядочить объект из responseData и записать его в файл, а не напрямую выводить запрос.

+1

Я нашел ту же проблему при использовании файлов outputStream JSON игнорируются –

+0

Некоторые говорят, что имеет смысл, что путь outputStream будет равен нулю, поскольку в этом случае нужен разработчик, а не данные (которые уже хранятся в файле). Но всегда есть случаи, когда нам нужны оба ... – BabyPanda

0
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    manager.responseSerializer = [AFCompoundResponseSerializer serializer]; 

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/octet-stream"]; 

    AFHTTPRequestOperation *operation = [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    if (responseObject) { 

    } 
    else{ 

     } 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 


    }]; 

[operation start]; 

// manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject: @ "приложения/октет потока"]; : может варьироваться в зависимости от того, что вы ожидаете

Смежные вопросы