Python-利用suds进行webservice接口调用、xml解析及踩坑(二)

1、安装:

pip install suds-jurko

2、引入Client

from suds.client import Client

3、数据准备,发送请求

url = "http://IP:PORT/*************?wsdl"
# 设置headers
headers = {'Content-Type': 'application/soap+xml; charset="UTF-8"'}
client = Client(url, headers=headers, faults=False, timeout=15)
# 准备接口请求报文
data = "" \
    "请求内容....."
# queryOA 为接口方法
result = client.service.queryOA(data)

# 接口返回结果: (, 1success)

PS : 这里接口的返回结果为元祖,第一個元素为请求状态,第二個元素才是我们的响应报文哦。

4、解析

# from encoder import XML2Dict
from libs.encoder import XML2Dict    # 用的自己二次封装的encoder.py哦
xd = XML2Dict()
dict_result = xd.parse(result[1])
# dict_result 结果:
# {'RESP_PARAM': {'PUB_INFO': {'RESULT': '1', 'DESC': 'success'}}}

5、踩坑,xml转字典时bytes类型的处理

从上面可以看出,我是引入的自己的修改过后的py文件,如果是引入的site-packages下的encoder.py,转字典后的结果是下面这样的:

# 响应报文:1success
# 转字典后的结果:{'RESP_PARAM': {'PUB_INFO': {'RESULT': b'1', 'DESC': b'success'}}}

如果是这样的话,我们利用结果做断言的时候,就会遇到问题,因为你无法预知哪个接口哪个标签内容转换后会是byte类型,所以我选择了从源头处理:拷贝encoder文件到项目的libs目录,进行修改后,再引入自己项目中的这个文件哦!不建议直接修改该文件哦

 # 这是encoder.py中的方法
 def _make_dict(self, tag, value, attr=None):
        '''Generate a new dict with tag and value

        If attr is not None then convert tag name to @tag
        and convert tuple list to dict
        '''
        if isinstance(value, bytes):
            value = value.decode("utf-8")
        ret = {tag: value}

        # Save attributes as @tag value
        if attr:
            atag = '@' + tag

            aattr = {}
            for k, v in attr.items():
                aattr[k] = v

            ret[atag] = aattr

            del atag
            del aattr

        return ret

 

你可能感兴趣的:(自动化测试,#,接口测试)