上一篇我们学习了怎么发送各种数据类型的http请求,这一篇我们来介绍怎么来解析接口返回的XML的数据。

解析接口返回数据

定义结构体

假设我们现在有一个接口返回的数据resp如下:

<?xml version="1.0" encoding="utf-8"?>
<ResponseWithResponseInfo>
<code>00</code>
<message>SUCCESS</message>
<describe>成功</describe>
<resultInfo>
<uniqueNumber>201808161133401673324075025000035</uniqueNumber>
</resultInfo>
</ResponseWithResponseInfo>

要解析这个数据,首先我们要定义一个与之树状结构一致的结构体:

type XMLresp struct {
ResponseWithResponseInfo xml.Name `xml:"ResponseWithResponseInfo"`
Code int `xml:"code"`
Message string `xml:"message"`
Describe string `xml:"describe"`
ResultInfo struct {
XMLName xml.Name `xml:"resultInfo"`
UniqueNumber string `xml:"uniqueNumber"`
}
}

这里要注意xml.Name 这个tag,它表示后面的数据的父元素是什么,如果没有填写这个信息,在数据解析的时候可能会获取不到数据。

解析函数:

接下来我们就可以使用xml.Unmarshal方法将字符串中的数据解析出来了:

// XMLUnpack xml数据解析
func XMLUnpack(respbody string) (Prase []interface{}, errs error) {
temp := []byte(respbody)
v := XMLresp{}
errs = xml.Unmarshal(temp, &v)
Prase = []interface{}{v.Code, v.Message, v.Describe, v.ResultInfo.UniqueNumber}
if errs != nil {
return
}
return
}

测试

func main() {
data, _ := XMLUnpack(resp)
fmt.Println(data)
}

输出:

bingo@Mac unpackData$ go run paraseXML.go
[0 SUCCESS 成功 201808161133401673324075025000035]

优化

大家可能注意到了,我们在定义XMLUnpack这个函数的时候用于解析这个数据的结构体是固定的,也就是说这个函数只能解析同一个树桩结构的数据,每一个不同的接口我们都需要写一个与之对应的函数。这样我们可能会在后续面临一个问题,如果我们的接口多了,取怎样的函数名可能都会是困扰我们的一个大问题,而且会变得越来越不容易维护。

那么有没有办法能解决这个问题呢,答案当然是有的,下面我们一起来解决这个问题。



不知道大家还记不记得我么之前一起学习过的method语法,它的优点是可以让不同作用的函数使用同一个函数名称(属性),可以完成面向对象语言特有的继承和重写操作,如果忘记了可以看看之前的学习笔记【Golang】基础09 通过method完成面向对象

我们这次的优化其实就是method语法的一次实际应用,下面让我们来看一下具体的实现。

// XMLUnpack 短信网关xml返回结果解析
func (smsresp *XMLresp) XMLUnpack(respbody string) (Prase []interface{}, errs error) {
temp := []byte(respbody)
v := SmsXMLresp{}
errs = xml.Unmarshal(temp, &v)
Prase = []interface{}{v.Code, v.Message, v.Describe, v.ResultInfo.UniqueNumber}
if errs != nil {
return
}
return
}

现在的这个函数和之前的区别就在于我们指定了可以调用这个函数的数据类型为*XMLresp,只有这个类型的数据能够调用这个方法,同样的我们的调用方法也发生了一些小改变:我们需要先定义一个存储这个结构体的变量,然后再调用这个变量的方法,当然,这个变量在后续解析其他相同类型的数据时是可以无限次复用的。参考代码:

func main() {
var p XMLresp
data, _ := p.XMLUnpack(resp)
fmt.Println(data)
}

【Golang 接口自动化03】 解析接口返回XML的更多相关文章

  1. python接口自动化24-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  2. Golang通过结构体解析和封装XML

    Golang解析和封装XML 解析XML成结构体Demo package main import ( "encoding/xml" "fmt" ) //我们通过 ...

  3. python接口自动化--json解析神器jsonpath

    前言 做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言. 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间.一直在寻 ...

  4. requests接口自动化8-传递数据为xml形式的post请求:data

    传递数据为xml形式的post请求 请求体内容: <?xml version=“1.0” encoding = “UTF-8”?> <COM> <REQ name=&qu ...

  5. RobotFramework做接口自动化(内部接口需要登录token)

    背景: 项目中需要做接口自动化测试,使用robot,有一个收货地址列表的接口直接传参数访问时会返回:{"msg":"缺少参数","code" ...

  6. java 解析http返回xml数据

    //post 请求 private static String sendPost(String url, String urlParameters) throws Exception { URL ob ...

  7. python接口自动化根据请求接口类型进行封装

    根据不同的请求类型(GET/POST)进行接口请求封装 import requests import json class RunMain: def __init__(self, url, metho ...

  8. python接口自动化:调试接口的代码(无token情况下)

    实现代码如下: #接口调试 import requests,time class api_demo1: def __init__(self,RequestWay,url,data): self.s=r ...

  9. python接口自动化:对外接口sign签名

    签名参数sign生成的方法: 在接口开发过程中,一般通过时间戳+sign作为密匙加密传输 实现代码如下: #python实现sign签名 import hashlib,time class sign: ...

随机推荐

  1. 7.4 Models -- Pushing Records into the Store

    一.概述 1. store是作为一个所有records的缓存,这些records已经被你的应用程序加载.在你的app中如果你的路由或者一个controller请求一条record,如果它在缓存中这个s ...

  2. 浅谈Java中的==和equals

    引言 最近在看TIJ,看到==和equals相关内容,今天就来简单的总结下. 关系操作符== 书中对关系操作符的描述是这样的:"关系操作符生成的是一个boolean结果,它们计算的是操作数的 ...

  3. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  4. Linux服务器---基础设置

    Centos分辨率      virtualbox里新安装的Centos 7 的分辨率默认的应该是800*600. 如果是‘最小化安装’的Centos7 进入的就是命令模式 .如果安装的是带有GUI的 ...

  5. 50道JavaScript基础面试题(附答案)

    https://segmentfault.com/a/1190000015288700 1 介绍JavaScript的基本数据类型 Number.String .Boolean .Null.Undef ...

  6. Js基础知识2-对象、对象属性全解

    Object对象 Object对象包含如下属性和方法,也就意味着一切对象(函数也是对象)都包含如下方法. 每种方法和属性在不同的对象中有不同的作用,并不是每种对象都有使用每个方法的必要. 下面是Obj ...

  7. hibernate的实现原理以及延迟加载

    Hibernate是怎样实现呢?主要是依据反射机制. 现在以一次数据库查询操作分析Hibernate实现原理. 假设有一个用户表(tbl_user),表中字段有id,name,sex.同时有一个实体类 ...

  8. 在uboot中加入cmd_run命令,运行环境变量

    在学习uboot的过程中会经常烧录程序,每次都要敲一些下载指令.这样是不是很麻烦,有什么办法能快速的烧写呢.很简单,将需要敲击的指令编译到uboot中,以环境变量的形式存在.但是环境变量很好加,如何运 ...

  9. 20145309李昊《网络对抗技术》实验9 web安全基础实践

    本实验在同学帮助下完成 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前 ...

  10. USACO 1.3 Wormholes - 搜索

    Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...