Created
September 10, 2015 09:42
-
-
Save kn9ts/8ffeece6b87471f0391e to your computer and use it in GitHub Desktop.
Decoding and encoding SOAP using Go (Awesomeness!!!)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bytes" | |
"encoding/xml" | |
"fmt" | |
"github.com/webconnex/xmlutil" | |
"log" | |
//"net/http" | |
) | |
type Envelope struct { | |
Body `xml:"soap:"` | |
} | |
type Body struct { | |
Msg interface{} | |
} | |
type MethodCall struct { | |
One string | |
Two string | |
} | |
type MethodCallResponse struct { | |
Three string | |
} | |
func main() { | |
x := xmlutil.NewXmlUtil() | |
x.RegisterNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi") | |
x.RegisterNamespace("http://www.w3.org/2001/XMLSchema", "xsd") | |
x.RegisterNamespace("http://www.w3.org/2003/05/soap-envelope", "soap") | |
x.RegisterTypeMore(Envelope{}, xml.Name{"http://www.w3.org/2003/05/soap-envelope", ""}, | |
[]xml.Attr{ | |
xml.Attr{xml.Name{"xmlns", "xsi"}, "http://www.w3.org/2001/XMLSchema-instance"}, | |
xml.Attr{xml.Name{"xmlns", "xsd"}, "http://www.w3.org/2001/XMLSchema"}, | |
xml.Attr{xml.Name{"xmlns", "soap"}, "http://www.w3.org/2003/05/soap-envelope"}, | |
// ----------------- Adding safaricom SOAP Configurations ------------------------ | |
xml.Attr{xml.Name{"xmlns", "SOAP-ENV"}, "http://schemas.xmlsoap.org/soap/envelope/"}, | |
xml.Attr{xml.Name{"xmlns", "soapenv"}, "http://schemas.xmlsoap.org/soap/envelope/"}, | |
xml.Attr{xml.Name{"xmlns", "tns"}, "tns:ns"}, | |
}) | |
x.RegisterTypeMore("", xml.Name{}, []xml.Attr{ | |
xml.Attr{xml.Name{"http://www.w3.org/2001/XMLSchema-instance", "type"}, "xsd:string"}, | |
}) | |
buf := new(bytes.Buffer) | |
buf.WriteString(`<?xml version="1.0" encoding="utf-8"?>`) | |
buf.WriteByte('\n') | |
enc := x.NewEncoder(buf) | |
env := &Envelope{Body{MethodCall{ | |
One: "one", | |
Two: "two", | |
}}} | |
if err := enc.Encode(env); err != nil { | |
log.Fatal(err) | |
} | |
// Print request | |
bs := buf.Bytes() | |
bs = bytes.Replace(bs, []byte{'>', '<'}, []byte{'>', '\n', '<'}, -1) | |
fmt.Printf("%s\n\n", bs) | |
/* | |
// Send response, SOAP 1.2, fill in url, namespace, and action | |
var r *http.Response | |
if r, err = http.Post(url, "application/soap+xml; charset=utf-8; action="+namespace+"/"+action, buf); err != nil { | |
return | |
} | |
dec := x.NewDecoder(r.Body) | |
*/ | |
// Decode response | |
dec := x.NewDecoder(bytes.NewBufferString(`<?xml version="1.0" encoding="utf-8"?> | |
<soap:Envelope> | |
<soap:Body> | |
<MethodCallResponse> | |
<Three>three</Three> | |
</MethodCallResponse> | |
</soap:Body> | |
</soap:Envelope>`)) | |
find := []xml.Name{ | |
xml.Name{"", "MethodCallResponse"}, | |
xml.Name{"http://www.w3.org/2003/05/soap-envelope", "Fault"}, | |
} | |
var start *xml.StartElement | |
var err error | |
if start, err = dec.Find(find); err != nil { | |
log.Fatal(err) | |
} | |
if start.Name.Local == "Fault" { | |
log.Fatal("Fault!") // Here you can decode a Soap Fault | |
} | |
var resp MethodCallResponse | |
if err := dec.DecodeElement(&resp, start); err != nil { | |
log.Fatal(err) | |
} | |
fmt.Printf("%#v\n\n", resp.Three) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment