🦉SOAP package for Go
Go Soap

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",
},
},
}