Sample code for 30+ languages & platforms
Go

REST through SSH Tunnel

See more REST Examples

Demonstrates how to connect through an SSH Tunnel (via port-forwarding) to make REST API calls.

Chilkat Go Downloads

Go
    success := false

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    tunnel := chilkat.NewSocket()

    sshHostname := "sftp.example.com"
    sshPort := 22

    // Connect to an SSH server and establish the SSH tunnel:
    success = tunnel.SshOpenTunnel(sshHostname,sshPort)
    if success == false {
        fmt.Println(tunnel.LastErrorText())
        tunnel.DisposeSocket()
        return
    }

    // Authenticate with the SSH server via a login/password
    // or with a public key.
    // This example demonstrates SSH password authentication.
    success = tunnel.SshAuthenticatePw("mySshLogin","mySshPassword")
    if success == false {
        fmt.Println(tunnel.LastErrorText())
        tunnel.DisposeSocket()
        return
    }

    //  OK, the SSH tunnel is setup.  Now open a channel within the tunnel.
    //  (Any number of channels may be created from the same SSH tunnel.
    //  Multiple channels may coexist at the same time.)

    // This example connects to a REST server through the SSH tunnel.
    // It will connect to the Amazon AWS service for this example.
    rest := chilkat.NewRest()

    bTls := true
    port := 443
    maxWaitMs := 5000

    // This returns a socket object that is a single channel within the SSH tunnel.
    channel := chilkat.NewSocket()
    success = tunnel.SshNewChannel("s3.amazonaws.com",port,bTls,maxWaitMs,channel)
    if success == false {
        fmt.Println(tunnel.LastErrorText())
        tunnel.DisposeSocket()
        rest.DisposeRest()
        channel.DisposeSocket()
        return
    }

    // Use the connection.  (This connection is a TLS running on an SSH channel through an SSH tunnel.
    // In other words, TLS is wrapped within the SSH tunnel.)
    success = rest.UseConnection(channel,true)
    if success != true {
        fmt.Println(rest.LastErrorText())
        tunnel.DisposeSocket()
        rest.DisposeRest()
        channel.DisposeSocket()
        return
    }

    // Provide AWS credentials for the REST call.
    authAws := chilkat.NewAuthAws()
    authAws.SetAccessKey("AWS_ACCESS_KEY")
    authAws.SetSecretKey("AWS_SECRET_KEY")
    authAws.SetServiceName("s3")
    success = rest.SetAuthAws(authAws)

    // List all buckets for the account...
    responseXml := rest.FullRequestNoBody("GET","/")
    if rest.LastMethodSuccess() != true {
        fmt.Println(rest.LastErrorText())
        tunnel.DisposeSocket()
        rest.DisposeRest()
        channel.DisposeSocket()
        authAws.DisposeAuthAws()
        return
    }

    xml := chilkat.NewXml()
    success = xml.LoadXml(*responseXml)

    // Show the full XML returned.
    fmt.Println(*xml.GetXml())

    // Iterate over the buckets, showing each bucket name.
    success = xml.FindChild2("Buckets")
    if xml.FirstChild2() == true {
        fmt.Println(*xml.GetChildContent("Name"))
        for (xml.NextSibling2() == true) {
            fmt.Println(*xml.GetChildContent("Name"))
        }

    }

    // Move the internal pointer back to the root node.
    xml.GetRoot2()

    tunnel.DisposeSocket()
    rest.DisposeRest()
    channel.DisposeSocket()
    authAws.DisposeAuthAws()
    xml.DisposeXml()