当前位置: 首页 > 知识库问答 >
问题:

如何通过HTTPS在Golang中进行SOAP调用

樊博雅
2023-03-14
func main() {
    if soap, err := gosoap.SoapClient("https://domain:port/path?WSDL"); err != nil {
        fmt.Println(err)
        return
    } else {
        params := gosoap.Params{
            "param1": "abc",
            "param2":   "def",
            "param3":     "123",
        }

        if res, err := soap.Call("MethodName", params); err != nil {
            fmt.Println(err)
            return
        } else {
            fmt.Println(res)
            return
        }
    }
}
Get https://domain:port/path?WSDL: x509: certificate signed by unknown authority
  1. 如何发送头?
  2. 如何解决证书问题?

共有1个答案

鄂育
2023-03-14

正如Berkant comment所说,“这意味着运行应用程序的已安装CA无法确认证书”。

最好的方法是检查主机的证书是否有效并且配置正确。如果您的主机使用您自己的证书,最好是将其添加到您的系统/环境的已知证书中。你也可以把它添加到golang本身,或者忽略它。

要将您自己的证书添加到golang,请参阅以下答案:

如何用证书golang发送https请求

然后像下面这样设置客户端:

func SoapClient(wsdl string) (*gosoap.Client, error) {
    _, err := url.Parse(wsdl)
    if err != nil {
        return nil, err
    }

    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify : true},
    }

    //client := &http.Client{Transport: tr}//1: if you wanna add only soap headers
    client := &http.Client{Transport: NewAddHeaderTransport(tr)}//1: if you wanna add http headers

    //2: if you wann add soap headers, soap.Client has HeaderName and HeaderParams field

   soapClient := &gosoap.Client{
        HttpClient:      client,
        WSDL:        wsdl,
        URL:         strings.TrimSuffix(d.TargetNamespace, "/"),
    }

    err := getWsdlDefinitions(wsdl, &soapClient.Definitions, client)
    if err != nil {
        return nil, err
    }

    return soapClient, nil
}

//we use interface{} since gosoap.wsdlDefinitions is unexported
func getWsdlDefinitions(u string, wsdl interface{}, client *http.Client) (err error) {
    r, err := client.Get(u)
    if err != nil {
        return err
    }
    defer r.Body.Close()

    decoder := xml.NewDecoder(r.Body)
    decoder.CharsetReader = charset.NewReaderLabel
    return decoder.Decode(wsdl)
}

type AddHeaderTransport struct {
    T http.RoundTripper
}

func (adt *AddHeaderTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    req.Header.Add("Your-Header", "your header value")
    return adt.T.RoundTrip(req)
}

func NewAddHeaderTransport(T http.RoundTripper) *AddHeaderTransport {
    if T == nil {
        T = http.DefaultTransport
    }
    return &AddHeaderTransport{T}
}
 类似资料:
  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 假设Adwords是Google的事物,而Go是Google的事物,那么用Go编写的Adwords API版本需要多长时间? 与此问题相关的另一个问题是:是否

  • 问题内容: 由于Java不支持指针,如何像在C和C ++中那样通过Java引用来调用函数? 问题答案: 在Java中,真正的按引用传递是不可能的。Java通过值传递所有内容,包括引用。但是您可以使用容器对象来模拟它。 使用以下任何一个作为方法参数: 数组 集合 AtomicXYZ类 并且,如果您在方法中更改其内容,则更改的内容将可用于调用上下文。 糟糕,您的意思显然是通过引用调用方法。在Java中

  • 我有一个使用WebFlux和REST API的反应性Spring应用程序。每当用户调用我的API,我都需要调用一个公开WSDL的SOAP服务,执行一些操作并返回结果。 如何将对SOAP服务的调用与反应性WebFlux框架结合起来? 在我看来,我可以用两种不同的方式来做: 使用WebFlux的WebClient构造并发送SOAP消息。 在Mono/flux中使用WebServiceGatewaySu

  • 问题内容: 通过AJAX从标准HTTP页面调用HTTPS页面(例如信用卡授权服务,例如WorldPay)是否会有问题? 我无法想象为什么会有问题,响应将是HTML页面,然后我可以将其嵌入结果窗格或类似的页面? 问题答案: 是的,这将是跨域发布,并且将被浏览器阻止。

  • 我遇到了使用客户端存根通过https发送soap请求的问题。我正在运行Ubuntu16并使用Eclipse。Ive使用KeyTool在中添加了证书。 如有任何帮助,我们将不胜感激。

  • 问题内容: 我看了以下链接,但似乎没有什么具体的。 Android中的Secure HTTPPost 此功能不再起作用,我已经对其进行了测试,并且有其他人评论说它不起作用。 我也检查了一下:DefaultHttpClient,证书,Https和发布问题!这似乎可行,但Blogger只是让您感到困惑。更多分步说明会有所帮助。我未能通过他的第二步,因此设法获得了证书。 http://www.makeu