AFNetworking上传进度发送SOAP NSData

时间:2012-11-07 22:15:01

标签: objective-c ios afnetworking nsmutableurlrequest

我正在使用AFNetworking,并希望将NSData对象上传到我的服务器。我正在尝试上传到我们的SOAP服务器,因此我将XML转换为NSData对象。出于某种原因,以下操作不起作用:

// Back to NSData
    NSData *convertedFile = [xml dataUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:siteConfiguration.soapURL];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
        [formData appendPartWithFormData:convertedFile name:assetCreation.name];
    }];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {

        // Progress
        float totalProgress = (float)totalBytesWritten/(float)totalBytesExpectedToWrite;
        progress(totalProgress, totalBytesWritten, totalBytesExpectedToWrite);
        if (totalBytesExpectedToWrite == totalBytesWritten) {

            completion();

        }
    }];
    [operation start];

但是当不使用multipartFormRequestWithMethod块时,它正在工作并且文件被正确上传,但是没有显示进度,因为回调只被调用一次:

// Back to NSData
NSData *convertedFile = [xml dataUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:siteConfiguration.soapURL];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod: @"POST"];
[request setHTTPBody:convertedFile];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {

    // Progress
    float totalProgress = (float)totalBytesWritten/(float)totalBytesExpectedToWrite;
    progress(totalProgress, totalBytesWritten, totalBytesExpectedToWrite);
    if (totalBytesExpectedToWrite == totalBytesWritten) {

        MatrixAsset *asset = [[MatrixAsset alloc] init];
        completion(asset);

    }
}];
[operation start];

我的服务器似乎真的希望通过我的HTTPBody对象发送NSData。是否可以对AFNetworking进度回调执行相同的操作?

2 个答案:

答案 0 :(得分:0)

好的,我明白了。看起来我错了:

// Setup the connection
    NSString *wsdlURL = [NSString stringWithFormat:@"%@?WSDL", siteConfiguration.soapURL];
    NSURL *serviceUrl = [NSURL URLWithString:wsdlURL];
    NSMutableURLRequest *serviceRequest = [NSMutableURLRequest requestWithURL:serviceUrl];
    [serviceRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
    [serviceRequest setHTTPMethod:@"POST"];
    [serviceRequest setHTTPBody:[xml dataUsingEncoding:NSUTF8StringEncoding]];

    // Operation
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:serviceRequest];
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {

        // Progress
        float totalProgress = (float)totalBytesWritten/(float)totalBytesExpectedToWrite;
        progress(totalProgress, totalBytesWritten, totalBytesExpectedToWrite);

    }];
    [operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success");
        MatrixAsset *asset = [[MatrixAsset alloc] init];
        completion(asset);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"error: %@", error.localizedDescription);
        NSLog(@"error: %@", error.localizedFailureReason);
    }];
    [operation start];

答案 1 :(得分:0)

您需要继续使用SOAPAction:

[serviceRequest setValue:@"SOAP_ACTION_URL" forHTTPHeaderField:@"SOAPAction"];