Sample code for 30+ languages & platforms
Swift

Page Through All Contacts

See more Google APIs Examples

Demonstrates how to page through the entire list of Google Contacts.

Chilkat Swift Downloads

Swift

func chilkatTest() {
    var success: Bool = false

    // 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

    let jsonToken = CkoJsonObject()!
    success = jsonToken.loadFile(path: "qa_data/tokens/googleContacts.json")
    if success != true {
        print("Failed to load googleContacts.json")
        return
    }

    let gAuth = CkoAuthGoogle()!
    gAuth.accessToken = jsonToken.string(of: "access_token")

    let rest = CkoRest()!

    // Connect using TLS.
    var bAutoReconnect: Bool = true
    success = rest.connect(hostname: "www.google.com", port: 443, tls: true, autoReconnect: bAutoReconnect)

    // Provide the authentication credentials (i.e. the access token)
    rest.setAuthGoogle(authProvider: gAuth)

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

    var startIndex: Int = 1
    var maxResults: Int = 25
    // The totalResults will get updated with the correct value in the 1st loop iteration..
    var totalResults: Int = 100
    // To retrieve the contacts in pages of 25 each, we need to send the following for each page.

    // 	GET /m8/feeds/contacts/default/full?max-results=25&start-index=<startIndex>
    // 	GData-Version: 3.0

    let sbMaxResults = CkoStringBuilder()!
    sbMaxResults.appendInt(value: maxResults)
    let sbStartIndex = CkoStringBuilder()!

    var loopIteration: Int = 0
    while startIndex <= totalResults {

        sbStartIndex.clear()
        sbStartIndex.appendInt(value: startIndex)

        rest.clearAllHeaders()
        rest.clearAllQueryParams()
        rest.addHeader(name: "GData-Version", value: "3.0")
        rest.addQueryParam(name: "start-index", value: sbStartIndex.getAsString())
        rest.addQueryParam(name: "max-results", value: sbMaxResults.getAsString())

        let sbResponseBody = CkoStringBuilder()!
        success = rest.fullRequestNoBodySb(httpVerb: "GET", uriPath: "/m8/feeds/contacts/default/full", sb: sbResponseBody)
        if success != true {
            print("\(rest.lastErrorText!)")
            return
        }

        // A successful response will have a status code equal to 200.
        if rest.responseStatusCode.intValue != 200 {
            print("response status code = \(rest.responseStatusCode.intValue)")
            print("response status text = \(rest.responseStatusText!)")
            print("response header: \(rest.responseHeader!)")
            print("response body: \(sbResponseBody.getAsString()!)")
            return
        }

        // If the 200 response was received, then the contacts XML is contained
        // in the response body.
        let xml = CkoXml()!
        xml.loadSb(sb: sbResponseBody, autoTrim: false)

        // Now let's parse the XML...

        // Get the the total number of results, the start index, and the items per page.
        // We'll likely NOT get the full list, but will instead get the 1st page.
        totalResults = xml.getChildIntValue(tagPath: "openSearch:totalResults").intValue
        var startIndex2: Int = xml.getChildIntValue(tagPath: "openSearch:startIndex").intValue
        var itemsPerPage: Int = xml.getChildIntValue(tagPath: "openSearch:itemsPerPage").intValue
        print("totalResults = \(totalResults)")
        print("startIndex = \(startIndex2)")
        print("itemsPerPage = \(itemsPerPage)")

        // Iterate over each contact.
        var numEntries: Int = xml.numChildrenHavingTag(tag: "entry").intValue
        var i: Int = 0
        while i < numEntries {
            xml.i = i
            print("\(loopIteration * maxResults + i + 1) ----")
            print("title: \(xml.getChildContent(tagPath: "entry[i]|title")!)")

            var idUrl: String? = xml.getChildContent(tagPath: "entry[i]|id")
            print("id: \(idUrl!)")

            var fullName: String? = xml.chilkatPath(cmd: "entry[i]|gd:name|gd:fullName|*")
            if xml.lastMethodSuccess == true {
                print("fullName: \(fullName!)")
            }

            var emailAddress: String? = xml.chilkatPath(cmd: "entry[i]|gd:email|(address)")
            if xml.lastMethodSuccess == true {
                print("email address: \(emailAddress!)")
            }

            // Find the photo link and check to see if this contact has a photo.
            var xLink: CkoXml? = xml.getChild(withAttr: "link", attrName: "rel", attrValue: "http://schemas.google.com/contacts/2008/rel#photo")
            if xml.lastMethodSuccess == true {
                // Get the photo etag.
                var bHasPhoto: Bool = xLink!.hasAttribute(name: "gd:etag")
                if bHasPhoto == true {
                    print("This contact has a photo.")
                }

                xLink = nil
            }

            i = i + 1
        }

        startIndex = startIndex + maxResults
        loopIteration = loopIteration + 1
    }


}