peticion - ¿Cómo hacer una llamada SOAP en Go?
peticion web service soap jmeter (2)
No puedo ''responder acerca de la API de AdWords ya que no vi ningún anuncio de la compañía y predecir el tiempo antes de que un lanzamiento se pueda hacer desde el exterior.
Así que responderé a tu segunda pregunta.
No conozco ninguna biblioteca SOAP en Go ( go-lang.cat-v.org no parece hacer referencia a una) pero, como en la mayoría de los idiomas, una forma de tratar con mensajes SOAP simples es utilizar el http básico y el xml. bibliotecas.
Las dos operaciones importantes son
1) para obtener una respuesta haciendo una consulta POST:
resp, err := httpClient.Post(query, "text/xml; charset=utf-8", someXMLasBytes)
2) decodificarlo usando un xml.NewDecoder
en la estructura deseada:
parser := xml.NewDecoder(bytes.NewBufferString(in))
err = parser.DecodeElement(&envelope, nil)
Aquí hay un ejemplo completo y comentado de una consulta SOAP realizada en Go ( simplificada a partir de esto ):
package main
import (
"bytes"
"encoding/xml"
"fmt"
"io"
"io/ioutil"
"net/http"
"strings"
)
// The URL of the SOAP server
const MH_SOAP_URL = "http://sp.mountyhall.com/SP_WebService.php"
// this is just the message I''ll send for interrogation, with placeholders
// for my parameters
const SOAP_VUE_QUERY_FORMAT = "<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"no/"?><SOAP-ENV:Envelope xmlns:SOAP-ENV=/"http://schemas.xmlsoap.org/soap/envelope//" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:tns=/"urn:SP_WebService/" xmlns:soap=/"http://schemas.xmlsoap.org/wsdl/soap//" xmlns:wsdl=/"http://schemas.xmlsoap.org/wsdl//" xmlns:SOAP-ENC=/"http://schemas.xmlsoap.org/soap/encoding//" ><SOAP-ENV:Body><mns:Vue xmlns:mns=/"uri:mhSp/" SOAP-ENV:encodingStyle=/"http://schemas.xmlsoap.org/soap/encoding//"><numero xsi:type=/"xsd:string/">%d</numero><mdp xsi:type=/"xsd:string/">%s</mdp></mns:Vue></SOAP-ENV:Body></SOAP-ENV:Envelope>"
// Here I define Go structures, almost identical to the structure of the
// XML message we''ll fetch
// Note that annotations (the string "return>item") allow to have a slightly
// different structure or different namings
type SoapItem struct {
Numero int
Nom string
Type string
PositionX int
PositionY int
PositionN int
Monde int
}
type SoapVue struct {
Items []SoapItem "return>item"
}
type SoapFault struct {
Faultstring string
Detail string
}
type SoapBody struct {
Fault SoapFault
ProfilResponse SoapProfil
VueResponse SoapVue
}
type SoapEnvelope struct {
XMLName xml.Name
Body SoapBody
}
// Here is the function querying the SOAP server
// It returns the whole answer as a Go structure (a SoapEnvelope)
// You could also return an error in a second returned parameter
func GetSoapEnvelope(query string, numero int, mdp string) (envelope *SoapEnvelope) {
soapRequestContent := fmt.Sprintf(query, numero, mdp)
httpClient := new(http.Client)
resp, err := httpClient.Post(MH_SOAP_URL, "text/xml; charset=utf-8", bytes.NewBufferString(soapRequestContent))
if err != nil {
// handle error
}
b, e := ioutil.ReadAll(resp.Body) // probably not efficient, done because the stream isn''t always a pure XML stream and I have to fix things (not shown here)
if e != nil {
// handle error
}
in := string(b)
parser := xml.NewDecoder(bytes.NewBufferString(in))
envelope = new(SoapEnvelope) // this allocates the structure in which we''ll decode the XML
err = parser.DecodeElement(&envelope, nil)
if err != nil {
// handle error
}
resp.Body.Close()
return
}
Dado que Adwords es una cosa de Google, y Go es algo de Google, ¿cuánto tiempo hasta que haya una versión de la API de Adwords escrita en Go?
Asociado con esa pregunta, otro: ¿hay alguna biblioteca SOAP para Go todavía?
Google APIs for Go es un trabajo en progreso.