0

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

// 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进度回调做同样的事情?

4

2 回答 2

0

您需要 SOAPAction 才能继续:

[serviceRequest setValue:@"SOAP_ACTION_URL" forHTTPHeaderField:@"SOAPAction"];
于 2013-05-30T07:00:32.453 回答
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];
于 2012-11-08T01:27:03.553 回答