Sample code for 30+ languages & platforms
Objective-C

Download Google Contact Photo

See more Google APIs Examples

Demonstrates how to download Google Contact's photo.

Chilkat Objective-C Downloads

Objective-C
#import <CkoJsonObject.h>
#import <CkoAuthGoogle.h>
#import <CkoRest.h>
#import <CkoStringBuilder.h>
#import <NSString.h>
#import <CkoBinData.h>

BOOL success = NO;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

// --------------------------------------------------------------------------------------------------------
// Note: The code for setting up the Chilkat REST object and making the initial connection can be done once.
// Once connected, the REST object may be re-used for many REST API calls.
// (It's a good idea to put the connection setup code in a separate function/subroutine.)
// --------------------------------------------------------------------------------------------------------

// It is assumed we previously obtained an OAuth2 access token.
// This example loads the JSON access token file 
// saved by this example: Get Google Contacts OAuth2 Access Token

CkoJsonObject *jsonToken = [[CkoJsonObject alloc] init];
success = [jsonToken LoadFile: @"qa_data/tokens/googleContacts.json"];
if (success != YES) {
    NSLog(@"%@",@"Failed to load googleContacts.json");
    return;
}

CkoAuthGoogle *gAuth = [[CkoAuthGoogle alloc] init];
gAuth.AccessToken = [jsonToken StringOf: @"access_token"];

CkoRest *rest = [[CkoRest alloc] init];

// Connect using TLS.
BOOL bAutoReconnect = YES;
success = [rest Connect: @"www.google.com" port: [NSNumber numberWithInt: 443] tls: YES autoReconnect: bAutoReconnect];

// Provide the authentication credentials (i.e. the access token)
[rest SetAuthGoogle: gAuth];

// ----------------------------------------------
// OK, the REST connection setup is completed..
// ----------------------------------------------

// To get the photo, send the following:

// 	GET /m8/feeds/photos/media/default/contactId

[rest AddHeader: @"GData-Version" value: @"3.0"];

CkoStringBuilder *sbPath = [[CkoStringBuilder alloc] init];
// Get the photo for the contact having contactId = "1ea2e4fe0ef24e09"
NSString *contactId = @"1ea2e4fe0ef24e09";
[sbPath SetString: @"/m8/feeds/photos/media/default/{contactId}"];
int numReplacements = [[sbPath Replace: @"{contactId}" replacement: contactId] intValue];

CkoBinData *imageData = [[CkoBinData alloc] init];
success = [rest FullRequestNoBodyBd: @"GET" uriPath: [sbPath GetAsString] binData: imageData];
if (success != YES) {
    NSLog(@"%@",rest.LastErrorText);
    return;
}

// A 404 response indicates the contact has no photo.
// (We could've first fetched the contact information, parsed out the 
// photo etag, and then if no photo etag existed, we'd know the contact has no
// photo.  Or... we can just try to download the photo and if a 404 is received,
// we know there's no photo.  Much simpler.)
if ([rest.ResponseStatusCode intValue] == 404) {
    NSLog(@"%@",@"This contact has no photo.");
    return;
}

// A successful response will have a status code equal to 200.
if ([rest.ResponseStatusCode intValue] != 200) {
    // If the response was not successful, then the response body
    // does not contain image data.  Instead it contains XML.
    CkoStringBuilder *sbResponseBody = [[CkoStringBuilder alloc] init];
    [sbResponseBody AppendBd: imageData charset: @"utf-8" offset: [NSNumber numberWithInt: 0] numBytes: [NSNumber numberWithInt: 0]];

    NSLog(@"%@%d",@"response status code = ",[rest.ResponseStatusCode intValue]);
    NSLog(@"%@%@",@"response status text = ",rest.ResponseStatusText);
    NSLog(@"%@%@",@"response header: ",rest.ResponseHeader);
    NSLog(@"%@%@",@"response body: ",[sbResponseBody GetAsString]);
    NSLog(@"%@%@",@"request startline: ",rest.LastRequestStartLine);
    NSLog(@"%@%@",@"request header: ",rest.LastRequestHeader);
    return;
}

// Examine the content-type in the response header so we know what file
// extension to use (.jpg, .png, etc.)
CkoStringBuilder *sbContentType = [[CkoStringBuilder alloc] init];
[sbContentType Append: [rest ResponseHdrByName: @"Content-Type"]];

if ([sbContentType ContentsEqual: @"image/jpeg" caseSensitive: NO] == YES) {
    [imageData WriteFile: @"qa_output/contact_photo.jpg"];
}

if ([sbContentType ContentsEqual: @"image/png" caseSensitive: NO] == YES) {
    [imageData WriteFile: @"qa_output/contact_photo.png"];
}

NSLog(@"%@%@",@"Content-Type: ",[sbContentType GetAsString]);
NSLog(@"%@",@"Success.");