Sample code for 30+ languages & platforms
Zig

Azure Blob - Get Tags (Check if Blob Exists)

See more Azure Cloud Storage Examples

Gets the user-defined tags for a specified blob. This can also be used as a way to check to see if a blob exists.

Chilkat Zig Downloads

Zig
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.

    const rest = try chilkat.Rest.init();
    defer rest.deinit();

    // Connect to the Azure Storage Blob Service
    const b_tls = true;
    const port = 443;
    const b_auto_reconnect = true;
    // In this example, the storage account name is "chilkat".
    rest.connect("chilkat.blob.core.windows.net", port, b_tls, b_auto_reconnect) catch {
        std.debug.print("{s}\n", .{try rest.getLastErrorText(alloc)});
        return;
    };

    // Provide Azure Cloud credentials for the REST call.
    const az_auth = try chilkat.AuthAzureStorage.init();
    defer az_auth.deinit();
    az_auth.setAccessKey("AZURE_ACCESS_KEY");
    // The account name used here should match the 1st part of the domain passed in the call to Connect (above).
    az_auth.setAccount("chilkat");
    az_auth.setScheme("SharedKey");
    az_auth.setService("Blob");
    // This causes the "x-ms-version: 2021-08-06" header to be automatically added.
    az_auth.setXMsVersion("2021-08-06");
    try rest.setAuthAzureStorage(az_auth);

    // Note: The application does not need to explicitly set the following
    // headers: Content-Length, x-ms-date, Authorization.  These headers
    // are automatically set by Chilkat.

    // The Azure blob container is "test", the file is "helloWorld.txt"
    // Add "?comp=tags" to get the user-defined tags instead of the actual blob content.
    const sb = try chilkat.StringBuilder.init();
    defer sb.deinit();
    rest.fullRequestNoBodySb("GET", "/test/helloWorldajdfadf.txt?comp=tags", sb) catch {
        // Examine the request/response to see what happened.
        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("---\n", .{});
        std.debug.print("LastRequestStartLine: {s}\n", .{try rest.getLastRequestStartLine(alloc)});
        std.debug.print("LastRequestHeader: {s}\n", .{try rest.getLastRequestHeader(alloc)});
        return;
    };

    // A typical blob with no tags will return this:

    // <?xml version="1.0" encoding="utf-8"?>
    // <Tags><TagSet/></Tags>

    // If the blob does not exist, you get this:

    // <?xml version="1.0" encoding="utf-8"?>
    // <Error>
    //     <Code>BlobNotFound</Code>
    //     <Message>The specified blob does not exist.
    //     RequestId:fcfefdd9-301e-001a-2135-3a23d2000000
    //     Time:2023-02-06T14:17:00.7805577Z
    //     </Message>
    // </Error>

    std.debug.print("{s}\n", .{try sb.getAsString(alloc)});

    // To see if we got Tags or an Error, then examine the XML.
    const xml = try chilkat.Xml.init();
    defer xml.deinit();
    xml.loadSb(sb, true) catch {};

    // Examine the tag..
    if (xml.tagEquals("Tags")) {
        std.debug.print("Blob exists!\n", .{});
    } else {
        if (xml.childContentMatches("Code", "BlobNotFound", true)) {
            std.debug.print("Blob does not exist.\n", .{});
        } else {
            std.debug.print("Some other error...\n", .{});
        }
    }

    std.debug.print("Success.\n", .{});
}