大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
最近项目中在对接某保险公司线上webService接口时,无奈Golang没有像java那般有现成的jar包或库使用,只好从底层基于soap协议通过http post来实现对接。
对接过程中,由于开始并未注意版本问题(webService接口使用soap1.2协议版本,对接时使用soap1.1协议版本),导致很长时间对接报500返回。成都创新互联公司是一家专注于成都网站建设、网站设计与策划设计,马关网站建设哪家好?成都创新互联公司做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:马关等地区。马关做网站价格咨询:18980820575
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
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
POST /WSShakespeare.asmx HTTP/1.1
Host: www.xmlme.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
string
soap 1.1 使用 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap 1.2 使用 xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
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
主要体现在消息格式的命名空间上。
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))
}
以需求驱动技术,技术本身没有优略之分,只有业务之分。