Zig
Zig
Update a Google Contact
See more Google APIs Examples
Demonstrates how to update a Google Contact.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 update a contact, we'll first get the contact information,
// then we'll make changes to the XML and then PUT the update.
// To retrieve the contact, send the following:
// GET /m8/feeds/contacts/default/full/{contactId}
// GData-Version: 3.0
rest.addHeader("GData-Version", "3.0") catch {};
const sb_path = try chilkat.StringBuilder.init();
defer sb_path.deinit();
sb_path.append("/m8/feeds/contacts/default/full/{contactId}") catch {};
// Get the contact having contactId = "5b6d64980b1ed462"
_ = sb_path.replace("{contactId}", "5b6d64980b1ed462");
const sb_response_body = try chilkat.StringBuilder.init();
defer sb_response_body.deinit();
rest.fullRequestNoBodySb("GET", try sb_path.getAsString(alloc), 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 {};
// Get the etag:
const last_known_etag = try xml.getAttrValue(alloc, "gd:etag");
std.debug.print("lastKnownEtag = {s}\n", .{last_known_etag});
// Update the XML.
// We're going to add or update with the following information:
// <gd:name>
// <gd:givenName>Joe</gd:givenName>
// <gd:familyName>Sample</gd:familyName>
// <gd:fullName>Joe Sample</gd:fullName>
// </gd:name>
// <content type="text">RIP Joe Sample, a great musician...</content>
// <gd:extendedProperty name="pet" value="hamster"/>
xml.updateChildContent("gd:name|gd:givenName", "Joe");
xml.updateChildContent("gd:name|gd:familyName", "Sample");
xml.updateChildContent("gd:name|gd:fullName", "Joe Sample");
xml.updateChildContent("content", "RIP Joe Sample, a great musician...");
xml.updateAttrAt("content", true, "type", "text") catch {};
xml.updateAttrAt("gd:extendedProperty", true, "name", "pet") catch {};
xml.updateAttrAt("gd:extendedProperty", true, "value", "hamster") catch {};
// Send the following:
// PUT /m8/feeds/contacts/default/full/{contactId}
// If-Match: {lastKnownEtag}
// GData-Version: 3.0
// Content-Type: application/atom+xml
rest.clearAllHeaders() catch {};
rest.addHeader("If-Match", last_known_etag) catch {};
rest.addHeader("GData-Version", "3.0") catch {};
rest.addHeader("Content-Type", "application/atom+xml") catch {};
const sb_request_body = try chilkat.StringBuilder.init();
defer sb_request_body.deinit();
xml.getXmlSb(sb_request_body) catch {};
// The sbPath already contains the correct path..
rest.fullRequestSb("PUT", try sb_path.getAsString(alloc), sb_request_body, 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 updated contact XML is contained
// in the response body.
xml.loadSb(sb_response_body, false) catch {};
std.debug.print("Response Body:\n", .{});
std.debug.print("{s}\n", .{try xml.getXml(alloc)});
std.debug.print("Success.\n", .{});
}