>백엔드 개발 >Golang >직접 WSDL 지원 없이 Go에서 SOAP 요청 및 응답을 어떻게 처리할 수 있나요?

직접 WSDL 지원 없이 Go에서 SOAP 요청 및 응답을 어떻게 처리할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-02 01:00:14713검색

How Can I Handle SOAP Requests and Responses in Go Without Direct WSDL Support?

Go의 WSDL/SOAP 지원

Go의 WSDL에 대한 직접적인 지원은 없지만 SOAP를 처리하는 데 사용할 수 있는 몇 가지 옵션이 있습니다. 요청 및 응답.

SOAP 요청 작성 수동

표준 인코딩/xml 패키지를 사용하여 SOAP 요청을 수동으로 생성할 수 있지만 네임스페이스, 접두사 등 SOAP의 특정 측면을 처리하는 데 필요한 기능이 부족합니다.

xmlutil 라이브러리 사용

github.com/webconnex/xmlutil 라이브러리는 다음을 제공합니다. SOAP 요청 및 응답을 처리하기 위한 더욱 강력한 솔루션입니다. 여기에는 다음과 같은 기능이 포함됩니다.

  • 네임스페이스 및 접두사 레지스트리
  • 사용자 정의 유형 등록
  • 유형 정보를 사용한 XML 인코딩 및 디코딩
  • 유형 지원 시행, xsi:type 속성 등

수동 SOAP 응답 디코딩

SOAP 응답을 디코딩하려면 인코딩/xml 패키지 또는 xmlutil과 같은 라이브러리를 사용할 수 있습니다. 이 프로세스에는 디코더를 사용하여 XML 응답을 구문 분석하고 원하는 데이터를 추출하는 작업이 포함됩니다.

xmlutil을 사용한 예

다음은 답변에 제공된 예의 수정된 버전입니다. :

package main

import (
    "bytes"
    "github.com/webconnex/xmlutil"
    "log"
    "strings"
    "encoding/xml"
)

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"},
        })
    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(`<soap:Envelope><soap:Body><MethodCall><One>one</One><Two>two</Two></MethodCall></soap:Body></soap:Envelope>`)

    enc := x.NewEncoder(buf)
    env := &Envelope{Body{MethodCall{
        One: "one",
        Two: "two",
    }}}
    if err := enc.Encode(env); err != nil {
        log.Fatal(err)
    }

    response := `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Body>
        <MethodCallResponse>
            <Three>three</Three>
        </MethodCallResponse>
    </soap:Body>
</soap:Envelope>`
    
    dec := x.NewDecoder(strings.NewReader(response))
    var resp Envelope
    if err := dec.DecodeElement(&resp, nil); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%#v\n", resp)
}

위 내용은 직접 WSDL 지원 없이 Go에서 SOAP 요청 및 응답을 어떻게 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.