Zig
Zig
Find Contact Having Email Address
See more Google APIs Examples
Demonstrates how to fetch the Google Contact for a given email address.Chilkat Zig Downloads
const std = @import("std");
const chilkat = @import("chilkat");
pub fn main(init: std.process.Init) !void {
const alloc = init.arena.allocator();
// 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
const json_token = try chilkat.JsonObject.init();
defer json_token.deinit();
json_token.loadFile("qa_data/tokens/googleContacts.json") catch {
std.debug.print("Failed to load googleContacts.json\n", .{});
return;
};
const g_auth = try chilkat.AuthGoogle.init();
defer g_auth.deinit();
g_auth.setAccessToken(try json_token.stringOf(alloc, "access_token"));
const rest = try chilkat.Rest.init();
defer rest.deinit();
// Connect using TLS.
const b_auto_reconnect = true;
try rest.connect("www.google.com", 443, true, b_auto_reconnect);
// Provide the authentication credentials (i.e. the access token)
rest.setAuthGoogle(g_auth) catch {};
// ----------------------------------------------
// OK, the REST connection setup is completed..
// ----------------------------------------------
// To retrieve the contacts, we need to send the following:
// GET /m8/feeds/contacts/default/full?q=<emailAddress>
// GData-Version: 3.0
// Get the contact (or contacts) with this email address:
const email_address_to_find = "admin@chilkatsoft.com";
rest.addHeader("GData-Version", "3.0") catch {};
rest.addQueryParam("q", email_address_to_find) catch {};
const sb_response_body = try chilkat.StringBuilder.init();
defer sb_response_body.deinit();
rest.fullRequestNoBodySb("GET", "/m8/feeds/contacts/default/full", sb_response_body) catch {
std.debug.print("{s}\n", .{try rest.getLastErrorText(alloc)});
return;
};
// A successful response will have a status code equal to 200.
if (rest.getResponseStatusCode() != 200) {
std.debug.print("response status code = {d}\n", .{rest.getResponseStatusCode()});
std.debug.print("response status text = {s}\n", .{try rest.getResponseStatusText(alloc)});
std.debug.print("response header: {s}\n", .{try rest.getResponseHeader(alloc)});
std.debug.print("response body: {s}\n", .{try sb_response_body.getAsString(alloc)});
return;
}
// If the 200 response was received, then the contacts XML is contained
// in the response body.
const xml = try chilkat.Xml.init();
defer xml.deinit();
xml.loadSb(sb_response_body, false) catch {};
// See below for a sample response body.
xml.saveXml("qa_output/google_contacts.xml") catch {};
// 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.
const total_results = xml.getChildIntValue("openSearch:totalResults");
const start_index = xml.getChildIntValue("openSearch:startIndex");
const items_per_page = xml.getChildIntValue("openSearch:itemsPerPage");
std.debug.print("totalResults = {d}\n", .{total_results});
std.debug.print("startIndex = {d}\n", .{start_index});
std.debug.print("itemsPerPage = {d}\n", .{items_per_page});
// We'll borrow a method from FileAccess to get the contactId from the URL string (see the code in the while loop)
const fac = try chilkat.FileAccess.init();
defer fac.deinit();
// Iterate over each contact.
const num_entries = xml.numChildrenHavingTag("entry");
var i: i32 = 0;
while (i < num_entries) {
xml.setI(i);
std.debug.print("{d} ----\n", .{i + 1});
std.debug.print("title: {s}\n", .{try xml.getChildContent(alloc, "entry[i]|title")});
// The entry "id" child contains a URL having this format:
// <id>http://www.google.com/m8/feeds/contacts/{userEmail}/base/{contactId}</id>
// Let's get the URL and parse the contactId from it..
const id_url = try xml.getChildContent(alloc, "entry[i]|id");
std.debug.print("id: {s}\n", .{id_url});
// Use the parsing ability of GetFileName to get the contactId
const contact_id = try fac.getFileName(alloc, id_url);
std.debug.print("contactId: {s}\n", .{contact_id});
if (xml.chilkatPath(alloc, "entry[i]|gd:name|gd:fullName|*")) |full_name| {
std.debug.print("fullName: {s}\n", .{full_name});
} else |_| {}
if (xml.chilkatPath(alloc, "entry[i]|gd:email|(address)")) |email_address| {
std.debug.print("email address: {s}\n", .{email_address});
} else |_| {}
i = i + 1;
}
}