Archive for 12th February 2013

Migrating ASIHTTPRequest to AFNetworking (uploading a PNG to a web service)

For part 2 of my AFNetworking migration experiences, let’s cover uploading a file to a web service.

Here is the original code:

    NSString *ws = [NSString stringWithFormat:@"http://myurl.com?id=%@", theID];
    NSURL *url = [NSURL URLWithString:ws];
    NSData *postData = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
    ASIFormDataRequest *request;
    request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];  
    [request setPostValue:pictureFileName forKey:@"file"];  
    [request setData:postData withFileName:pictureFileName andContentType:@"image/png" forKey:@"file"];
    [request setRequestMethod:@"POST"];
    [request setShouldAttemptPersistentConnection:YES];
    [request setUploadProgressDelegate:progressView];
    [request setCompletionBlock:^{
        NSLog(@"success with response string %@", request.responseString);
    }];
 
    [request setFailedBlock:^{
        NSLog(@"error: %@", request.error.localizedDescription);
    }];
 
    [request startAsynchronous];

And here is the AFNetworking code:

    NSString *ws = [NSString stringWithFormat:@"http://myurl.com?id=%@", theID];
    NSURL *url = [NSURL URLWithString:ws];
    NSData *postData = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
    NSDictionary *sendDictionary = [NSDictionary dictionaryWithObject:postData forKey:@"file"];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    NSMutableURLRequest *afRequest = [httpClient multipartFormRequestWithMethod:@"POST"
                                                                           path:@""
                                                                     parameters:sendDictionary
                                                      constructingBodyWithBlock:^(id < AFMultipartFormData > formData)
                                      {
                                          [formData appendPartWithFileData:postData
                                                                      name:pictureFileName
                                                                  fileName:pictureFileName
                                                                  mimeType:@"image/png"];
                                      }
                                      ];
 
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest];
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
        if (totalBytesExpectedToWrite == 0)
        {
            progressView.progress = 0.0;
        }
        else
        {
            progressView.progress = totalBytesWritten * 1.0 / totalBytesExpectedToWrite;
        }
    }];
 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
     {
        NSLog(@"success with response string %@", operation.responseString);
     }
                              failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {
        NSLog(@"error: %@", error.localizedDescription);
     }];
 
    [operation start];

The AFNetworking code is somewhat longer, so that is a bit of a problem. If anyone has any suggestions on how to make the AFNetworking code a bit more concise, please let me know.

BTW, Happy Birthday to Joe Don Baker, a distinguished actor with such outstanding films to his credit such as Mitchell, Final Justice, Fletch, and of course the all-time classic, Joysticks.