博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SOAP--------Golang对接WebService服务实战
阅读量:7262 次
发布时间:2019-06-29

本文共 2862 字,大约阅读时间需要 9 分钟。

背景

最近项目中在对接某保险公司线上webService接口时,无奈Golang没有像java那般有现成的jar包或库使用,只好从底层基于soap协议通过http post来实现对接。

对接过程中,由于开始并未注意版本问题(webService接口使用soap1.2协议版本,对接时使用soap1.1协议版本),导致很长时间对接报500返回。

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=""

soap 1.2 使用 xmlns:soap=""

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 mainimport (    "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))}

总结

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

转载于:https://blog.51cto.com/lisea/2066046

你可能感兴趣的文章
【Linux网络编程】基于TCP流 I/O多路转接(poll) 的高性能http服务器
查看>>
[LeetCode] Basic Calculator III 基本计算器之三
查看>>
python爬虫 赶集网
查看>>
Unix环境高级编程-阻塞访问原理——等待队列
查看>>
博客园页面源代码结构分析
查看>>
強化 Python 在 Vim 裡的顏色
查看>>
WPF实现物理效果 拉一个小球
查看>>
Win10 设置窗口背景色
查看>>
解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题或禁止第一次加载...
查看>>
函数柯里化 curry
查看>>
硬怼高晓松系列:大哥,你这么能吹,这次砸招牌了吧?
查看>>
Mysql 连接数,最大并发数设置
查看>>
Debug Hacks中文版——深入调试的技术和工具
查看>>
WPF触控程序开发(二)——整理的一些问题
查看>>
python selenium
查看>>
PHP超级全局变量、魔术变量和魔术函数的区别和联系
查看>>
洛谷P1730 最小密度路径(floyd)
查看>>
javascript和python取dict字典对象的不同
查看>>
Java 8 – Convert Instant to ZonedDateTime
查看>>
RabbitMQ 3.6.1 升级至 3.7.9 版本(Windows 升级至Centos)
查看>>