Cara melakukan panggilan SOAP di Golang melalui HTTPS

Saya mencoba melakukan panggilan SOAP melalui https.

Saya telah mencoba menggunakan perpustakaan gosoap["github.com/tiaguinho/gosoap"] .

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

Inilah kesalahan yang saya dapatkan:

Get https://domain:port/path?WSDL: x509: certificate signed by unknown authority
  1. Bagaimana cara mengirim Header?
  2. Bagaimana cara mengatasi masalah sertifikat?

person Eric Fernandes    schedule 18.04.2019    source sumber
comment
Ini berarti CA yang terinstal tempat aplikasi Anda berjalan tidak dapat mengonfirmasi sertifikat.   -  person Berkant Ipek    schedule 19.04.2019


Jawaban (1)


Seperti komentar Berkant, "ini berarti CA yang diinstal tempat aplikasi Anda berjalan tidak dapat mengonfirmasi sertifikat".

Yang terbaik adalah memeriksa apakah sertifikat host Anda valid dan dikonfigurasi dengan benar. Jika host Anda menggunakan sertifikat Anda sendiri, cara terbaik adalah menambahkannya ke sertifikat pengetahuan sistem/lingkungan Anda. Anda juga dapat menambahkannya ke golang itu sendiri, atau mengabaikannya.

Untuk menambahkan sertifikat Anda sendiri ke golang, lihat jawaban ini:

https://stackoverflow.com/questions/38822764/how-to-send-a-https-request-with-a-certificate-golang/38825553#38825553

Kemudian atur klien seperti di bawah ini:

Untuk mengabaikannya, gosoap.Client memiliki bidang Klien yang memungkinkan set http.Client, tetapi hanya setelah memanggil gosoap.SoapClient, jadi Anda perlu meniru gosoap.SoapClient:

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}
}
person gstvg    schedule 07.05.2020