0

在某些情况下,我在下载文件或管理错误时遇到问题 (JSON)

下载工作非常好。问题是当用户请求下载时,服务器可以在少数情况下发送 404 或 200(使用 JSON)。

在这种情况下如何处理 JSON?当我们发送请求时,我们不知道我们是否会收到 JSON 错误(状态为 200 或 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 的文件?感谢您的帮助。

编辑:正如我在评论中所写,只有当我评论该行时,我才能在成功块中获取并捕获 responseData:

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

这是合乎逻辑的,我想响应进入 outputStream 而不是成功块。有解决方案吗?

4

3 回答 3

1

服务器应在标头中指示 MIME 类型Content-Type。如果不是,您需要自己检测数据类型。

此行确保在成功块中获得所有状态码为 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

于 2012-06-19T10:44:29.863 回答
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:@"application/octet-stream"]; :可以根据您的期望而有所不同

于 2015-01-21T05:03:27.653 回答
0

我尝试过使用 AFJSOnRequestOperation,在 .m 中我只是将 outputStream 放在 init 下方:

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

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

同样的情况,除非注释 outputStream 行,否则 responseData 为零,因此不是 HTTPRequest 或 JSOnRequest 问题。我用来解决的方法是对来自 responseData 的对象进行 JSON 排序并将其写入文件,而不是直接输出请求。

于 2012-09-24T05:36:54.200 回答