Domain = NSURLErrorDomain Code = -1021“请求正文流已耗尽”

我收到NSURLErrorDomain Code = -1021“请求正文流已用尽”

NSLocalizedDescription =请求正文流耗尽,NSUnderlyingError = 0x2088c080“请求正文流耗尽”}

上传多个大尺寸图像时出现此错误我正在使用AFNetworking并尝试在线搜索修复但未成功

NSDictionary *clientUniqueId = [NSDictionary dictionaryWithObject:NSLocalizedString(uniqueDrId, nil) forKey:@"clientUniqueId"]; NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:pendingUpload.urlPath parameters:clientUniqueId constructingBodyWithBlock:^(id formData) { [formData appendPartWithFormData:[pendingUpload dataRecordData] name:@"dr"]; NSArray *attachments = pendingUpload.attachments; if (attachments != nil) { for (Attachment *attachment in attachments) { [formData appendPartWithFileData:attachment.data name:attachment.key fileName:attachment.filename mimeType:attachment.contentType]; } } }]; 

如AFNetworking FAQ中所述 :

为什么某些上传请求失败并显示错误“请求正文流已耗尽”? 这是什么意思,我该如何解决这个问题?

通过3G或EDGE连接上传时,请求可能会因“请求正文流耗尽”而失败。 使用-throttleBandwidthWithPacketSize:delay:您的多部分表单构造块,您可以根据建议值( kAFUploadStream3GSuggestedPacketSizekAFUploadStream3GSuggestedDelay )设置最大数据包大小和延迟。 这降低了输入流超过其分配带宽的风险。 不幸的是,从iOS 6开始,没有明确的方法可以区分3G,EDGE或LTE连接。 因此,建议您不要仅根据网络可达性来限制带宽。 相反,您应该考虑在故障块中检查“请求正文流已耗尽”,然后使用限制带宽重试请求。

我也遇到了这个问题,并且没有使用throttleBandwithWithPacketSize方法。 我相信在我的情况下,这是一个身份validation挑战问题。

我最终做的是切换到AFNetworking 2.0中的URLSession连接方法,这似乎解决了它。 这是我最终使用的代码:

  NSString *uploadAttachmentURL = @"https://mydomain.zendesk.com/api/v2/uploads.json?filename=screenshot.jpeg"; NSData *imageData = UIImageJPEGRepresentation(image, 1.0); NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; _afHTTPSessionManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration]; // hack to allow 'text/plain' content-type to work NSMutableSet *contentTypes = [NSMutableSet setWithSet:_AFOpManager.responseSerializer.acceptableContentTypes]; [contentTypes addObject:@"text/plain"]; _afHTTPSessionManager.responseSerializer.acceptableContentTypes = contentTypes; [_afHTTPSessionManager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"[USERNAME]" password:@"[PASSWORD]"]; [_afHTTPSessionManager POST:uploadAttachmentURL parameters:nil constructingBodyWithBlock:^(id formData) { [formData appendPartWithFileData:imageData name:@"screenshot" fileName:@"photo.jpg" mimeType:@"image/jpeg"]; } success:^(NSURLSessionDataTask *task, id responseObject) { DDLogError(@"screenshot operation success! %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { DDLogError(@"Operation Error: %@", error); }];