xml 接口

什么是 xml ?

xml 是一种和 html 非常类似的语言,采取一定的格式展示数据。比如:

xml 会对你要展示的数据进行结构化表示。

html ===> 网页结构化表示的

<note>  # 这是一个便签
    <to>Johnny</to>   #便签是留给谁的? 关键词:
    <from>yuz</from>   # 便签是谁写的。
    <title>提醒</title>   # 便签的标题。
    <body>今晚八点,不见不散</body>  # 便签的内容
</note>

这个例子非常形象的指明:

  • 这是一个便条
  • 便条是给你的
  • 便条是我写的
  • 标题是:提醒
  • 内容是:今晚八点,不见不散

xml 和 html 的区别

  • xml 设计的初衷在于传输数据,重点在数据;
  • html 设计的初衷在于展示数据,重点在展示;
  • html 通过和 css 的组合能展现非常美观的效果,xml 志不在此。

接口当中为什么会有 xml ?

xml 的作用和 json 实在是太像了。 通过 json, 可以代替 xml 的作用:

{
    "note": {
        "to": "你",
        "from": "我",
        "heading": "提醒",
        "body": "今晚八点,不见不散",
    }
}

以前,接口通常会采用 xml 来传输数据。而现在,大多数接口都是采用 json 进行数据传递, xml 已经被冷落了,主要的原因是:

  • json 数据传输量较小,xml 常常要使用各种属性,冗余信息较多;
  • json 支持数字, 布尔, null, 数组,对象等通用格式,xml 都是文本;
  • json 解析更方便
  • xml 的数据管理更混乱
XML 元素 vs. 属性
请看这些实例:

<person gender="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

<person>
<gender>female</gender>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
在第一个实例中,sex 是一个属性。在第二个实例中,sex 是一个元素。这两个实例都提供相同的信息。

没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用元素。我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用元素吧。

但是,还是有一些公司的接口是采用 xml, 比如大名鼎鼎的微信,很多接口还是采用 xml。 原因是 xml 在一些特定领域还占有一些优势:

  • 可读性稍微占优势;
  • 可以添加注释:<!-- This is a comment -->
  • 对于 UI 页面,可以更方便的使用属性这样一种形态进行页面数据的传输,比如安卓应用。
  • 历史优势。 xml 相比 json 发展更早,还有很多有经验的程序员偏爱 xml, Java 程序员有喜欢 xml 的倾向(现在已经很少了)。 微信的很多 api 还是用 xml, 也许是出于这些原因。

xml 和 json 的区别,归根结底在于他们表达数据的方式不同,xml 用的是树形结构, json 对应的是 hash 映射。

xml 的格式和美化

可以使用 css 格式化,但是使用 CSS 格式化 XML 不是常用的方法。

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>

W3C 推荐使用 XSLT.

哪些地方用了 xml

  • 安卓页面

使用工具测试 xml 数据接口

接口发送 xml 格式的数据和发送 json 几乎一样,只需要把格式改成 xml 就可以了。

采用 postman 接口测试工具 往接口https://httpbin.org/post 发送以下 xml 数据:

<note>
<to>you</to>
<from>yuz</from>
<heading>hey</heading>
<body>8 tonight</body>
</note>

postman 数据填写:

https://i.loli.net/2020/03/02/m5QzYAGFIO21Ktf.png

通过 fiddler 抓包可以查看到发送的数据:

https://i.loli.net/2020/03/02/VbTJ2yeiUrafkQq.png

通过 postman 查看返回结果:

https://i.loli.net/2020/03/02/CgG82oImv3yHtRz.png

通过上面的例子得出:

  • xml 格式的发送只需要修改请求头格式
  • 请求头格式为 Content-Type: application/xml

使用 python 编程语言测试 xml 数据接口

使用 python 语言的 requests 库可以很方便的发送 xml 格式的数据,只需要把请求头格式换成 application/xml 就可以了:

import requests

xml_data = """
<note>
<to>you</to>
<from>yuz</from>
<heading>hey</heading>
<body>8 tonight</body>
</note>
"""

header = {"content-type": "application/xml"}
res = requests.post('http://httpbin.org/post', data=xml_data, headers=header)

xml 数据存储在文件当中

测试数据如果不是通过在代码中直接传递,而是通过文件形式存储,则使用 python 当中的 open 函数直接读取。

https://i.loli.net/2020/03/02/VOtqeSXZvsMYFED.png

相应代码:

xml_data = open('data.xml').read()
header = {"content-type": "application/xml"}
res = requests.post('http://httpbin.org/post', data=xml_data, headers=header)

总结

  • xml 只是一种数据格式,和 json / text 没有区别
  • 理解什么是接口测试,理解 http 请求。

参考资料

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7d22cfb2-977e-4a5a-acae-ddf0ad5099f2/Untitled.png

2021_0603_xml.zip