SOAP--------Golang对接WebService服务实战-创新互联

背景

最近项目中在对接某保险公司线上webService接口时,无奈Golang没有像java那般有现成的jar包或库使用,只好从底层基于soap协议通过http post来实现对接。
对接过程中,由于开始并未注意版本问题(webService接口使用soap1.2协议版本,对接时使用soap1.1协议版本),导致很长时间对接报500返回。

目前创新互联已为1000+的企业提供了网站建设、域名、雅安服务器托管网站运营、企业网站设计、察哈尔右翼中旗网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

soap 简介

SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。

soap 版本

soap1.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"

 
 
   
     
      string 
     
   

soap1.2

POST /WSShakespeare.asmx HTTP/1.1 
Host: www.xmlme.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

 
 
   
     
      string 
     
   

通过对比1.1和1.2请求head和body数据,得出以下差异

两者的命名空间不同。

soap 1.1 使用 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap 1.2 使用 xmlns:soap="http://www.w3.org/2003/05/soap-envelope"

HTTP头信息上存在差异。

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消息格式不同。

主要体现在消息格式的命名空间上。

golang 编码对接服务(使用官方net/http包)

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 := ` 
   
     
      string 
     
   
`

    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 := ` 
   
     
      string 
     
   
`

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

总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章题目:SOAP--------Golang对接WebService服务实战-创新互联
文章路径:http://azwzsj.com/article/cscjpp.html