当前位置: 首页 > article >正文

Go解析soap数据和修改其中数据

一、解析soap数据

package main 

import (
    "fmt" 
    "encoding/xml" 
) 

type Envelope struct { 
    XMLName xml.Name 
    Header Header 
} 

type Header struct { 
    XMLName xml.Name `xml:"Header"` 
    Security Security `xml:"Security"` 
} 

type Security struct { 
    XMLName  xml.Name `xml:"Security"` 
    MustUnderstand string `xml:"mustUnderstand,attr"` 
    WSSE   string `xml:"wsse,attr"` 
    SOAP   string `xml:"soap,attr"` 
    UsernameToken struct { 
     XMLName xml.Name `xml:"UsernameToken"` 
     Username string `xml:"Username"` 
     Password string `xml:"Password"` 
    } 
} 

func main() { 

    Soap := []byte(`<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 

    <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <wsse:UsernameToken> 
     <wsse:Username>USERNAME</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">SECRET</wsse:Password> 
     </wsse:UsernameToken> 
    </wsse:Security> 
    </SOAP-ENV:Header> 

    <SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <OTA_HotelAvailNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="abc123" Version="1.0" TimeStamp="2005-08-01T09:30:47+08:00"> 
     <AvailStatusMessages HotelCode="HOTEL"> 
     <AvailStatusMessage BookingLimit="10"> 
      <StatusApplicationControl Start="2010-01-01" End="2010-01-14" InvTypeCode="A1K" RatePlanCode="GLD"/> 
     </AvailStatusMessage> 
     </AvailStatusMessages> 
    </OTA_HotelAvailNotifRQ> 
    </SOAP-ENV:Body> 

</SOAP-ENV:Envelope>`) 

    res := &Envelope{} 
    err := xml.Unmarshal(Soap, res) 

    fmt.Println(res.Header.Security.UsernameToken.Username, err) 
} 

二、修改其中部分数据

1、代码一

package main
 
import (
    "fmt"
    "strings"
)
 
 
var xmlRaw = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties 
 xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core- 
 properties" xmlns:dc="http://purl.org/dc/elements/1.1/" 
 xmlns:dcterms="http://purl.org/dc/terms/" 
 xmlns:dcmitype="http://purl.org/dc/dcmitype/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title> 
<dc:subject></dc:subject><dc:creator>John Kerry</dc:creator> 
<cp:keywords></cp:keywords><dc:description></dc:description> 
<cp:lastModifiedBy>TomHanks</cp:lastModifiedBy><cp:revision>6</cp:revision> 
<dcterms:created xsi:type="dcterms:W3CDTF">2018-02- 
20T18:08:00Z</dcterms:created><dcterms:modified 
xsi:type="dcterms:W3CDTF">2018-04-24T19:43:00Z</dcterms:modified> 
</cp:coreProperties>`
 
type decoder struct {
 
}
 
func main() {
 
    fmt.Println(strings.Replace(xmlRaw, "TomHanks", "Jerry Garcia", 1))
}

2、代码二

package main
 
import (
    "encoding/xml"
    "fmt"
)
 
var xmlRaw = []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties 
 xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core- 
 properties" xmlns:dc="http://purl.org/dc/elements/1.1/" 
 xmlns:dcterms="http://purl.org/dc/terms/" 
 xmlns:dcmitype="http://purl.org/dc/dcmitype/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title> 
<dc:subject></dc:subject><dc:creator>John Kerry</dc:creator> 
<cp:keywords></cp:keywords><dc:description></dc:description> 
<cp:lastModifiedBy>TomHanks</cp:lastModifiedBy><cp:revision>6</cp:revision> 
<dcterms:created xsi:type="dcterms:W3CDTF">2018-02- 
20T18:08:00Z</dcterms:created><dcterms:modified 
xsi:type="dcterms:W3CDTF">2018-04-24T19:43:00Z</dcterms:modified> 
</cp:coreProperties>`)
 
type decoder struct {
    Keywords       string `xml:"keywords"`
    LastModifiedBy string `xml:"lastModifiedBy"`
    //.. more xml
}
 
func main() {
    d := decoder{}
    if err := xml.Unmarshal(xmlRaw, &d); err != nil {
        panic(err)
    }
    fmt.Println(d.LastModifiedBy)
    d.LastModifiedBy = "Jerry Garcia"
    bytes, err := xml.Marshal(d)
    if err != nil {
        panic(err)
    }
 
    fmt.Println(string(bytes))
 
}package main
 
import (
    "encoding/xml"
    "fmt"
)
 
var xmlRaw = []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties 
 xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core- 
 properties" xmlns:dc="http://purl.org/dc/elements/1.1/" 
 xmlns:dcterms="http://purl.org/dc/terms/" 
 xmlns:dcmitype="http://purl.org/dc/dcmitype/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title> 
<dc:subject></dc:subject><dc:creator>John Kerry</dc:creator> 
<cp:keywords></cp:keywords><dc:description></dc:description> 
<cp:lastModifiedBy>TomHanks</cp:lastModifiedBy><cp:revision>6</cp:revision> 
<dcterms:created xsi:type="dcterms:W3CDTF">2018-02- 
20T18:08:00Z</dcterms:created><dcterms:modified 
xsi:type="dcterms:W3CDTF">2018-04-24T19:43:00Z</dcterms:modified> 
</cp:coreProperties>`)
 
type decoder struct {
    Keywords       string `xml:"keywords"`
    LastModifiedBy string `xml:"lastModifiedBy"`
    //.. more xml
}
 
func main() {
    d := decoder{}
    if err := xml.Unmarshal(xmlRaw, &d); err != nil {
        panic(err)
    }
    fmt.Println(d.LastModifiedBy)
    d.LastModifiedBy = "Jerry Garcia"
    bytes, err := xml.Marshal(d)
    if err != nil {
        panic(err)
    }
 
    fmt.Println(string(bytes))
 
}

三、构造soap数据,发送http请求

package main

import (
	"bytes"
	"encoding/base64"
	"encoding/xml"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"
)

type FileSt struct {
	Str string
	I   int
}

type Envelope struct {
	XMLName xml.Name `xml:"soap:Envelope"`
	SoapNs  string   `xml:"xmlns:soapenv,attr"`
	Soapwss  string   `xml:"xmlns:wss,attr,omitempty"`
	Body    *Body
}
//<ns2:dmFileByteResponse xmlns:ns2="http://wssmcommlower/"creturns!"code".1"messade"."也""data","S4g50u-62ZICAN2WTI5NTEOJICA 5550ICAX21MT5NTEWD0ICA572CP5m21CAX20MT5NTEYICA 5 EH52CAX0WTI5NTEYOO="%<EtU
///ns2:dmFileByteResponse>
type Body struct {
	XMLName xml.Name `xml:"soap:Body"`
	Req     *Request
}
type Request struct {
	XMLName        xml.Name `xml:"wss:dmFileByte"`
	PolicyName string   `xml:"policyName"`
	SrcFile string   `xml:"srcFile"`
	SrcFileType string   `xml:"srcFileType"`
}
type EnvelopeRsp struct {
	XMLName xml.Name `xml:"soap:Envelope"`
	SoapNs  string   `xml:"xmlns:soapenv,attr"`
	Soapwss  string   `xml:"xmlns:wss,attr,omitempty"`
	Body    *RspBody
}
type RspBody struct {
	XMLName xml.Name `xml:"soap:Body"`
	Resp     *Response
}

type Response struct {
	XMLName        xml.Name `xml:"ns2:dmFileByteResponse"`
	Ns2        string `xml:"xmlns:ns2,attr"`
	Ret    string `xml:"Return"`
}

type Return struct {
	Code int   `xml:"code"`
	Msg string   `xml:"msg"`
	Data string   `xml:"data"`
}

func CreateSOAPRequest(src []byte) []byte {
	soap := &Envelope{
		SoapNs: "http://schemas.xmlsoap.org/soap/envelope/",
		Soapwss: "http://wssmcommlower/",
		Body: &Body{
			Req: &Request{
				PolicyName: "policyName test request",
				SrcFile: base64.StdEncoding.EncodeToString(src),
				SrcFileType: "txt",
			},
		},
	}
	output, err := xml.MarshalIndent(soap, "", "    ")
	fmt.Println(string(output))
	if err != nil {
		log.Panic(err)
	}
	return output
}
func main() {
	if len(os.Args)<4{
		fmt.Println("usage: xxx ip port filePath")
		return
	}
	client:=http.Client{}
	ip:=os.Args[1]
	port:=os.Args[2]
	filePath:=os.Args[3]
	url:=fmt.Sprintf("http://%s:%s/WSSmCommLower/wsSmCommLower?wsdl",ip,port)
	// 设置请求地址、方法及消息体
	srcByte,_:=ioutil.ReadFile(filePath)
	req,err:=http.NewRequest("POST",url,bytes.NewBuffer(CreateSOAPRequest(srcByte)))
	if err!=nil{
		log.Panic(err)
	}
	req.Header.Add("Content-Type","application/soap+xml;charset=utf-8")
	// 发送请求
	resp,err:=client.Do(req)
	if err!= nil {
		 fmt.Println("Request Error: ", err)
		 return
	}
	defer resp.Body.Close()

	// 解析响应
	var result []byte
	resp.Body.Read(result)
	fmt.Println(string(result))
	var soapResp EnvelopeRsp
	xml.Unmarshal(result,&soapResp)
}


http://www.kler.cn/news/136295.html

相关文章:

  • el-table相关的功能实现
  • PVE系统无损挂载ntfs格式物理磁盘
  • linux驱动—注册总线分析
  • mfc之tab标签控件的使用--附TabSheet源码
  • [RK3566-Android11] 使用SPI方式点LED灯带-JE2815/WS2812,实现呼吸/渐变/随音量变化等效果
  • 2024年10月24日第一部分AOP编程和自信
  • MR素数测试及 pycryptodome库下 已知MR伪素数以及强伪证 生成指定伪随机数生成器绕过素性检测
  • 网络工程师-HCIA网课视频学习
  • Apache Airflow (十二) :PythonOperator
  • 【Linux】【开发】使用sed命令遇到的乱码问题
  • 内置函数和消息传递API
  • 类与对象(上篇)
  • WinForms C# 导入和导出 CSV 文件 Spread.NET
  • Rust开发——切片(slice)类型
  • -bash: jps: command not found
  • React整理总结(五、Redux)
  • 【左程云算法全讲11】贪心算法 并查集
  • k8s的高可用集群搭建,详细过程实战版
  • 原型模式-C++实现
  • 《崩坏:星穹铁道》1.5仙舟罗浮-绥园全宝箱攻略
  • 【Linux】软连接和硬链接:创建、管理和解除链接的操作
  • Flutter 中数据存储的四种方式
  • 机器学习笔记 - Ocr识别中的CTC算法原理概述
  • JVM:内存模型、内存分配机制、内存分配冲突、JVM垃圾标记算法、JVM1.8增加元数据区缘由
  • python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例
  • 机器学习第8天:SVM分类