SOAP 介紹

soap 版本

由於目前流行使用的soap版本不同,所以在使用前要先確認Server採用哪種版本,以免發生錯誤。

1.1 版
POST /WSShakespeare.asmx HTTP/1.1 
Host: www.xmlme.com 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://xmlme.com/WebServices/GetSpeech"

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
  <soap:Body> 
    <GetSpeech xmlns="http://xmlme.com/WebServices"> 
      <Request>string</Request> 
    </GetSpeech> 
  </soap:Body> 
</soap:Envelope> 
1.2 版
POST /WSShakespeare.asmx HTTP/1.1 
Host: www.xmlme.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
  <soap12:Body> 
    <GetSpeech xmlns="http://xmlme.com/WebServices"> 
      <Request>string</Request> 
    </GetSpeech> 
  </soap12:Body> 
</soap12:Envelope> 

1.1 與 1.2 差異處

命名空間不同
soap 1.1 使用 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap 1.2 使用 xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
Header 設定不同
soap 1.1 使用 为Content-Type: text/xml; charset=UTF-8
soap 1.1 使用 SOAPAction
soap 1.2 使用 为Content-Type: application/soap+xml;charset=UTF-8
soap 1.2 不使用SOAPAction
SOAP消息格式不同

範例

使用 Go
package main

import (
    "net/http"
    "strings"
    "io/ioutil"
    "fmt"
)

func main() {
    Soap11("https://lisea.cn/test")
    Soap12("https://lisea.cn/test")
}

func Soap11(url string) {
    reqBody := `<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
  <soap:Body> 
    <GetSpeech xmlns="http://xmlme.com/WebServices"> 
      <Request>string</Request> 
    </GetSpeech> 
  </soap:Body> 
</soap:Envelope>`

    res, err := http.Post(url, "text/xml; charset=UTF-8", strings.NewReader(reqBody))
    if nil != err {
        fmt.Println("http post err:", err)
        return
    }
    defer res.Body.Close()

    // return status
    if http.StatusOk != res.StatusCode {
        fmt.Println("WebService soap1.1 request fail, status: %s\n", res.StatusCode)
        return
    }

    data, err := ioutil.ReadAll(res.Body)
    if nil != err {
        fmt.Println("ioutil ReadAll err:", err)
        return
    }

    fmt.Println("webService soap1.1 response: ", string(data))
}

// soap1.2例子
func Soap12(url string) {
    reqBody := `<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
  <soap12:Body> 
    <GetSpeech xmlns="http://xmlme.com/WebServices"> 
      <Request>string</Request> 
    </GetSpeech> 
  </soap12:Body> 
</soap12:Envelope>`

    res, err := http.Post(url, "application/soap+xml; charset=utf-8", strings.NewReader(reqBody))
    if nil != err {
        fmt.Println("http post err:", err)
        return
    }
    defer res.Body.Close()

    // return status
    if http.StatusOk != res.StatusCode {
        fmt.Println("WebService soap1.2 request fail, status: %s\n", res.StatusCode)
        return
    }

    data, err := ioutil.ReadAll(res.Body)
    if nil != err {
        fmt.Println("ioutil ReadAll err:", err)
        return
    }

    fmt.Println("webService soap1.2 response: ", string(data))
}