go-soap 简介

62 阅读2分钟

前言

最近需要调用一个第三方的接口进行数据的采集,这个接口是基于 SOAP 协议的,所以需要使用soap 相关的客户端进行调用。于是我调研了一些开源的 golang 的 soap 客户端,发现 go-soap 这个库的文档比较完善,而且使用起来也比较简单,所以就选择了这个库。

安装

使用以下命令进行安装:

go get github.com/tiaguinho/gosoap

使用

由于目前没有特别好的例子,这里就以官方的例子进行说明。

官方的代码如下:


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)

}

可以看到 go-soap的使用跟常规的 http client的使用方法类似,都是创建一个连接,准备方法的参数,然后调用相应的方法。

这段代码展示了如何使用 go-soap 库连接 SOAP 服务、发送请求、处理响应,以及如何解析 XML 格式的返回数据。

不足

在测试 go-soap 的过程中,发现 go-soap 缺少了一些功能,比如: 接口鉴权功能,现在的一些接口都需要鉴权,go-soap 目前没有提供鉴权的功能,需要自己实现。

除了使用 go-soap 之外,还可以手动 使用 http 库进行调用,但是这样需要自己处理一些细节,比如: 请求头,请求体,响应体等,比较麻烦。所以如果需要调用 soap 服务的话,建议使用 go-soap 库。

参考