Sample code for 30+ languages & platforms
Zig Requires Chilkat v11.0.0+

Send DocuSign XML Request

See more HTTP Misc Examples

Demonstrates how to send a DocuSign XML request.

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 requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    const req = try chilkat.HttpRequest.init();
    defer req.deinit();

    req.setHttpVerb("POST");

    // Replace "12999999" with your own account number. (12999999 is a ficticious account number)
    req.setPath("/restapi/v2/accounts/12999999/envelopes");

    req.addHeader("Accept", "application/xml");

    // Don't worry about the boundary string.  Chilkat will automatically generate one and include it.
    req.setContentType("multipart/form-data");

    const xml_cred = try chilkat.Xml.init();
    defer xml_cred.deinit();
    xml_cred.setTag("DocuSignCredentials");
    xml_cred.updateChildContent("Username", "YOUR_DOCUSIGN_USERNAME");
    xml_cred.updateChildContent("Password", "YOUR_DOCUSIGN_PASSWORD");
    xml_cred.updateChildContent("IntegratorKey", "ABCD-12345678-1234-AAAA-BBBB-abcdabcdabcd");
    xml_cred.setEmitXmlDecl(false);
    xml_cred.setEmitCompact(true);
    req.addHeader("X-DocuSign-Authentication", try xml_cred.getXml(alloc));

    // Don't worry about Host or Content-Length headers, Chilkat automatically adds them...

    // Build the XML for the 1st body part..
    const xml = try chilkat.Xml.init();
    defer xml.deinit();
    xml.setTag("envelopeDefinition");
    xml.addAttribute("xmlns", "http://www.docusign.com/restapi") catch {};
    xml.updateChildContent("emailSubject", "Signature Request: Test Test:001019:033611");
    xml.updateChildContent("status", "sent");
    xml.updateChildContent("documents|document|documentId", "1");
    xml.updateChildContent("documents|document|name", "001019_TestTest_RetailDeals_163357");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|hostEmail", "admin@chilkatsoft.com");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|hostName", "Chilkat Admin");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|signerName", "Test  Test");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|recipientId", "1");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|routingOrder", "1");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|signerEmail", "test@tyest.com");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere|anchorString", "\\SDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere|optional", "False");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[1]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[1]|anchorString", "\\OSDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[1]|optional", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[2]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[2]|anchorString", "\\OPSSDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[2]|optional", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[2]|scaleValue", "0.7");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[3]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[3]|anchorString", "\\PSSDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[3]|optional", "False");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|signHereTabs|signHere[3]|scaleValue", "0.7");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere|anchorString", "\\IDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere|optional", "False");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[1]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[1]|anchorString", "\\OIDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[1]|optional", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[2]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[2]|anchorString", "\\OPSIDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[2]|optional", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[2]|scaleValue", "0.5");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[3]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[3]|anchorString", "\\PSIDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[3]|optional", "False");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner|tabs|initialHereTabs|initialHere[3]|scaleValue", "0.5");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|hostEmail", "admin@chilkatsoft.com");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|hostName", "Chilkat Admin");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|signerName", "Dealer Representative");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|recipientId", "2");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|routingOrder", "2");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|signHereTabs|signHere|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|signHereTabs|signHere|anchorString", "\\DSDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|signHereTabs|signHere|optional", "False");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|signHereTabs|signHere[1]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|signHereTabs|signHere[1]|anchorString", "\\DOSDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|signHereTabs|signHere[1]|optional", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|initialHereTabs|initialHere|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|initialHereTabs|initialHere|anchorString", "\\DIDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|initialHereTabs|initialHere|optional", "False");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|initialHereTabs|initialHere[1]|anchorIgnoreIfNotPresent", "True");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|initialHereTabs|initialHere[1]|anchorString", "\\DOIDP");
    xml.updateChildContent("recipients|inPersonSigners|inPersonSigner[1]|tabs|initialHereTabs|initialHere[1]|optional", "True");
    xml.setEmitXmlDecl(false);

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

    xml.setEmitCompact(true);

    req.addStringForUpload2("", "", try xml.getXml(alloc), "utf-8", "application/xml") catch {};
    req.addFileForUpload2("", "qa_data/pdf/signatureForm.pdf", "application/pdf") catch {};
    req.addSubHeader(1, "Content-Disposition", "file; filename=\"signatureForm.pdf\";documentid=1") catch {};

    const http = try chilkat.Http.init();
    defer http.deinit();

    http.setSessionLogFilename("qa_output/log.txt");

    const resp = try chilkat.HttpResponse.init();
    defer resp.deinit();
    http.httpSReq("na2.docusign.net", 443, true, req, resp) catch {
        std.debug.print("{s}\n", .{try http.getLastErrorText(alloc)});
        return;
    };

    if (resp.getStatusCode() != 201) {
        std.debug.print("{s}\n", .{try resp.getBodyStr(alloc)});
        std.debug.print("Response status code: {d}\n", .{resp.getStatusCode()});
        std.debug.print("Failed.\n", .{});
        return;
    }

    // Examine the response..
    xml.loadXml(try resp.getBodyStr(alloc)) catch {};
    const envelope_id = try xml.getChildContent(alloc, "envelopeId");
    std.debug.print("envelopeId = {s}\n", .{envelope_id});
    const status = try xml.getChildContent(alloc, "status");
    std.debug.print("status = {s}\n", .{status});
    const status_date_time = try xml.getChildContent(alloc, "statusDateTime");
    std.debug.print("statusDateTime = {s}\n", .{status_date_time});
    const uri = try xml.getChildContent(alloc, "uri");
    std.debug.print("uri = {s}\n", .{uri});
}