read

UPDATE: For AFNetworking 2.0, refer to this tutorial instead.

AFNetworking is the choice for iOS/Mac developers when it comes to choosing a HTTP library.

ASIHTTPRequest used to be the choice, until 2011 when it became inactive.

I am one of the many who is forced to switch camp.

In many ways, it seems AFNetworking would be better. It uses blocks!

However, I find the documentation lacking. It has an overview, getting started, introduction, complete reference, … But yet, it didn’t provide example on how you make a simple HTTP GET or POST.

Here is how you do it:

GET

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://samwize.com/"]];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
                                                            path:@"http://samwize.com/api/pigs/"
                                                      parameters:nil];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        // Print the response body in text
        NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    [operation start];

POST

POST a urlencoded form name=piggy in the http body.

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://samwize.com/"]];
    [httpClient setParameterEncoding:AFFormURLParameterEncoding];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
                                                            path:@"http://samwize.com/api/pig/"
                                                      parameters:@{@"name":@"piggy"}];

    // Similar to GET code ...

If you want to POST a json such as {"name":"piggy"}, you change the encoding:

    [httpClient setParameterEncoding:AFJSONParameterEncoding];

If you want to do a multi-part POST of an image, you do this:

NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"http://samwize.com/api/pig/photo" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
    [formData appendPartWithFileData:imageData name:@"avatar" fileName:@"avatar.jpg" mimeType:@"image/jpeg"];
}];

This simple guide has been helped by this, this and this.

Pitfalls

Do not use [[AFHTTPClient alloc] init], as that does not initialize a lot of stuff. Use initWithBaseURL instead.

For instance, if in the above example (POST JSON) you had used init, the Content-Type will be

application/json; charset=(null)

Charset should be utf-8, not null.


Image

@samwize

¯\_(ツ)_/¯

Back to Home