tiaguinho / gosoap

🦉SOAP package for Go
MIT License
507 stars 176 forks source link
go golang gosoap soap soap-client soap-messages

Go Soap Build Status GoDoc Go Report Card Coverage Status patreon Known Vulnerabilities

package to help with SOAP integrations (client)

Install

go get github.com/tiaguinho/gosoap

Examples

Basic use

package main

import (
    "encoding/xml"
    "log"
    "net/http"
    "time"

    "github.com/tiaguinho/gosoap"
)

// GetIPLocationResponse will hold the Soap response
type GetIPLocationResponse struct {
    GetIPLocationResult string `xml:"GetIpLocationResult"`
}

// GetIPLocationResult will
type GetIPLocationResult struct {
    XMLName xml.Name `xml:"GeoIP"`
    Country string   `xml:"Country"`
    State   string   `xml:"State"`
}

var (
    r GetIPLocationResponse
)

func main() {
    httpClient := &http.Client{
        Timeout: 1500 * time.Millisecond,
    }
    soap, err := gosoap.SoapClient("http://wsgeoip.lavasoft.com/ipservice.asmx?WSDL", httpClient)
    if err != nil {
        log.Fatalf("SoapClient error: %s", err)
    }

    // Use gosoap.ArrayParams to support fixed position params
    params := gosoap.Params{
        "sIp": "8.8.8.8",
    }

    res, err := soap.Call("GetIpLocation", params)
    if err != nil {
        log.Fatalf("Call error: %s", err)
    }

    res.Unmarshal(&r)

    // GetIpLocationResult will be a string. We need to parse it to XML
    result := GetIPLocationResult{}
    err = xml.Unmarshal([]byte(r.GetIPLocationResult), &result)
    if err != nil {
        log.Fatalf("xml.Unmarshal error: %s", err)
    }

    if result.Country != "US" {
        log.Fatalf("error: %+v", r)
    }

    log.Println("Country: ", result.Country)
    log.Println("State: ", result.State)
}

Set Custom Envelope Attributes

package main

import (
    "encoding/xml"
    "log"
    "net/http"
    "time"

    "github.com/tiaguinho/gosoap"
)

// GetIPLocationResponse will hold the Soap response
type GetIPLocationResponse struct {
    GetIPLocationResult string `xml:"GetIpLocationResult"`
}

// GetIPLocationResult will
type GetIPLocationResult struct {
    XMLName xml.Name `xml:"GeoIP"`
    Country string   `xml:"Country"`
    State   string   `xml:"State"`
}

var (
    r GetIPLocationResponse
)

func main() {
    httpClient := &http.Client{
        Timeout: 1500 * time.Millisecond,
    }
    // set custom envelope
    gosoap.SetCustomEnvelope("soapenv", map[string]string{
        "xmlns:soapenv": "http://schemas.xmlsoap.org/soap/envelope/",
        "xmlns:tem": "http://tempuri.org/",
    })

    soap, err := gosoap.SoapClient("http://wsgeoip.lavasoft.com/ipservice.asmx?WSDL", httpClient)
    if err != nil {
        log.Fatalf("SoapClient error: %s", err)
    }

    // Use gosoap.ArrayParams to support fixed position params
    params := gosoap.Params{
        "sIp": "8.8.8.8",
    }

    res, err := soap.Call("GetIpLocation", params)
    if err != nil {
        log.Fatalf("Call error: %s", err)
    }

    res.Unmarshal(&r)

    // GetIpLocationResult will be a string. We need to parse it to XML
    result := GetIPLocationResult{}
    err = xml.Unmarshal([]byte(r.GetIPLocationResult), &result)
    if err != nil {
        log.Fatalf("xml.Unmarshal error: %s", err)
    }

    if result.Country != "US" {
        log.Fatalf("error: %+v", r)
    }

    log.Println("Country: ", result.Country)
    log.Println("State: ", result.State)
}

Set Header params

    soap.HeaderParams = gosoap.SliceParams{
        xml.StartElement{
            Name: xml.Name{
                Space: "auth",
                Local: "Login",
            },
        },
        "user",
        xml.EndElement{
            Name: xml.Name{
                Space: "auth",
                Local: "Login",
            },
        },
        xml.StartElement{
            Name: xml.Name{
                Space: "auth",
                Local: "Password",
            },
        },
        "P@ssw0rd",
        xml.EndElement{
            Name: xml.Name{
                Space: "auth",
                Local: "Password",
            },
        },
    }