ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用Postman测WebService接口:SOAP与REST从入门到排错

用Postman测WebService接口:SOAP与REST从入门到排错 做接口测试的人多多少少都跟Postman打过交道。平时测RESTful接口JSON一把梭顺手得很但一旦碰到老系统、制造业MES、银行核心或者供应链项目你会发现还有一堆WebService接口在跑。WSDL文件动不动就几百行报文是SOAP XML新手看到就想绕道。其实用Postman测WebService接口完全可行只要你理解SOAP的基本结构、会照着WSDL手写请求体很多看起来麻烦的活都能直接在Postman里干完。这篇内容就围绕这个场景展开从工具选型、安装配置、SOAP请求构造、REST接口调试到常见报错排查完整过一遍。适合刚接触接口测试的人、被老项目WebService接口折腾的同事以及想要用一个工具同时搞定SOAP和REST的团队。1. 先把概念理清楚WebService接口到底测什么1.1 WebService的两种主流风格SOAP与RESTWebService这个名词听起来很老但它不是一个单指某一样东西的概念。我们日常接触最多的WebService其实分两大流派一种是基于SOAP协议的接口另外一种是以REST风格暴露的服务。很多老系统里说的“WebService接口”默认就是指SOAP接口而新项目里的“接口”多指REST API。你拿Postman测之前必须先搞清楚对方给你的接口定义属于哪一种否则下面所有操作都会跑偏。SOAP接口的特点非常明显以XML为载体有严格的消息结构必须包含Envelope、Header、Body这些节点接口的能力通过WSDL文档描述里面定义了端口类型、操作名称、参数类型、返回类型。你可以把WSDL理解成一张“菜单”服务员照着菜单给你上菜哪怕你点菜的方式不对他也会给你打个叉。REST风格则完全不同。它把一切都抽象成资源用HTTP动词表达操作GET拿数据、POST创建数据、PUT更新、DELETE删除。报文格式大多数时候是JSON也可以XML没有强制要求必须包裹在一个信封里。测试REST接口本质上就是在测HTTP请求和响应的状态、结构、业务逻辑。用表格看更直观对比维度SOAP WebServiceREST API消息格式XML严格SOAP Envelope结构JSON或XML无信封包裹接口描述WSDL包含完整操作定义OpenAPI/Swagger或手动文档传输协议HTTP、HTTPS、SMTP等均可基本只用HTTP/HTTPS调用方式POST为主消息体是SOAP XMLGET/POST/PUT/DELETE等成熟度规范复杂稳定但笨重轻量灵活易调试在Postman中构造难度需要手写SOAP模板选择方法、填URL、填Body即可这个对比很重要因为你后续在Postman里的每一步操作都是由接口风格决定的。SOAP接口有固定的“套路”REST接口则更自由但也因此更容易在请求参数、Header上出问题。1.2 测试WebService接口我们到底在测什么不管SOAP还是REST接口测试的核心关注点都是一样的整理起来就四件事功能、性能、安全、稳定性。功能层面你要验证每个操作在合法入参下是否返回正确结果在非法入参下是否能给出合理异常。比如一个加法接口2加3返回5是正确传负数、传字符串、传空值是直接抛异常还是返回友好提示这些都要测。很多业务系统表面上看接口通了但实际上对边界值的处理稀烂所以接口测试不能只测“通不通”。性能层面至少在功能测试阶段要记录响应时间确认有没有明显超时。很多WebService是老代码数据库慢、业务逻辑重你测出一个5秒响应不去深究的话上线后用户就会抱怨卡顿。安全层面常见的就是鉴权、越权和数据篡改。SOAP接口经常要求在Header里带用户名密码或者TokenREST接口则常见Bearer Token、Basic Auth、Cookie会话。你要验证未登录情况下能不能访问接口换个用户身份能不能操作别人的数据。这些在Postman里都可以通过环境变量和请求脚本模拟。稳定性层面要注意接口的幂等性。比如同一个创建订单的接口你连续发两次服务端是生成两条订单还是只生成一条接口不做幂等处理时重复提交往往产生脏数据。测试时如果不小心就可能把测试环境的数据搞乱所以设计用例时就要把“重复调用”的情况包含进去同时做好数据清理。2. Postman是一款怎么样的接口测试工具2.1 为什么偏偏是Postman市面上能测WebService接口的工具并不少最专业的当属SoapUI能直接解析WSDL自动生成请求模板命令行党喜欢用curl写脚本灵活做压测的会用JMeter。但Postman在“日常接口调试”这个场景里有一个很大的优势轻量、直观、免费而且覆盖了绝大多数接口测试需求。SoapUI的确很专业但对很多同事来说也相当重。它有自己的工程概念、Mock Service、LoadTest面板光界面就能劝退小白。Postman则不同打开就是简单的请求编辑界面方法、URL、Headers、Body、Tests。即使在SOAP接口上需要你手写XML这个成本也不算高因为SOAP请求体结构相对固定照着WSDL抄就行。Postman另一个优势是它把接口管理做得很好。你可以把同一项目的接口放进一个Collection用环境变量区分开发、测试、生产环境用脚本自动提取Token用断言自动校验返回结果。这些功能在实际项目中非常实用。尤其当你负责几十个接口的回归时用Postman的Collection Runner批量跑一遍比在SoapUI里逐个看快得多。我见过很多团队只用Postman测REST接口SOAP接口都扔给开发自己用SoapUI调。实际上没必要一个工具就够。上手门槛低团队协作也方便。2.2 安装与基础配置几件你必须知道的事Postman的安装本身没什么难度去官网下载对应平台的安装包即可Windows、macOS、Linux都有。安装过程一路下一步就行。但真正让人头疼的是另外几个问题登录、汉化、版本更新以及偶尔出现的“重置密码发不过去”。Postman现在打开会鼓励你登录账号很多同事以为不登录就不能用其实不是。Postman完全可以在没有账号的情况下使用所有本地功能都正常比如构造请求、保存Collection、跑脚本。只有需要云端同步、分享到团队工作区时才必须登录。所以如果你只想本地用完全可以直接跳过登录。汉化的话Postman官方是没有中文版的但社区有汉化补丁。需要注意的是汉化包必须与Postman版本严格对应版本对不上会直接闪退。通常做法是查看当前Postman版本号去对应版本的汉化包路径下载替换安装目录下的resources/app.asar文件。替换前最好备份原文件避免汉化失败后无法还原。另外Postman更新很频繁新版本有时候会改变某些面板位置。如果你的脚本、环境变量比较多升级前建议先导出Collection和Environment做备份。很多人升级完发现原来的集合还在但环境变量丢了就是因为没备份。这个问题在团队里遇到太多次了我自己的习惯是每周至少导出一份json放到项目仓库里。还有一个反复被问的问题重置密码发不过去。如果你遇到官网密码重置邮件收不到可以先检查垃圾箱再检查自己注册时用的是什么邮箱如果还是不行最简单的方式是直接用本地免费模式不必非得登录。3. 用Postman测试WebService接口的完整实操过程3.1 从零构造一个SOAP请求用本地WebService做例子先讲SOAP。很多网上的教程会直接拿一个公网免费WebService地址来演示但公网服务不稳定也容易受到网络环境影响。最稳妥的方式是在本地用VS2022创建一个最简单的asmx WebService然后拿Postman去调所有环境你都能控制出问题也好排查。在VS2022里创建一个WebService其实不复杂。新建项目时选择“.NET Framework 的 ASP.NET Web 应用程序”然后添加新项选择“Web 服务(ASMX)”生成的文件里默认有一个HelloWorld方法。为了演示参数传递我把它改成了一个Add方法接收两个整数返回计算结果C#代码大概是这样的[WebMethod] public int Add(int a, int b) { return a b; }项目运行起来以后浏览器会打开一个asmx服务页面地址类似http://localhost:端口/Service.asmx。直接在浏览器地址栏加上?wsdl就能看到这个服务的WSDL定义。里面的targetNamespace一般是http://tempuri.org/。接下来打开Postman新建一个Request。需要做四件事第一请求方法选POST。SOAP接口虽然底层走HTTP但几乎都只用POST因为方法操作必须放在Body里。第二URL填asmx服务的地址也就是http://localhost:端口/Service.asmx。第三设置Headers。SOAP 1.1协议下至少需要两个Header一个是Content-Type: text/xml; charsetutf-8另一个是SOAPAction。SOAPAction的值通常是对应的操作命名空间加方法名比如http://tempuri.org/Add。有些服务不校验这个字段但加上最稳妥。如果你用的是SOAP 1.2Content-Type要改成application/soapxml; charsetutf-8而且通常不需要SOAPAction具体情况看WSDL。第四写Body。选择raw类型右侧格式选XML把下面的SOAP模板粘贴进去?xml version1.0 encodingutf-8? soap:Envelope xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.xmlsoap.org/soap/envelope/ soap:Body Add xmlnshttp://tempuri.org/ a2/a b3/b /Add /soap:Body /soap:Envelope点击Send正常情况下返回的响应当中会包含节点AddResult5/AddResult这样就完成了第一个SOAP接口的测试。这里有几个容易踩的细节我单独拿出来说。命名空间必须和WSDL完全一致否则服务端解析不了。参数节点必须放在soap:Body内部且不能漏掉方法节点。方法名的大小写、参数名大小写都必须跟WSDL定义一致因为XML是大小写敏感的。如果服务返回SOAP Fault多半就是这些地方不匹配。还有一种更省事的方式Postman支持直接从WSDL导入集合。你在浏览器里打开http://localhost:端口/Service.asmx?wsdl复制地址然后在Postman里选择Import粘贴WSDL地址。Postman会自动解析里面的操作生成对应的请求集合。不过需要提醒你不同版本对WSDL的解析能力有差别有时候导入出来的请求模板缺命名空间或SOAPAction还是需要手动检查一下。所以我的建议是导入后先发一个测试请求确认无误再拿去给别人用。3.2 用Postman测试REST风格的WebService接口如果你的“WebService接口”实际上是REST API那测试流程会轻松很多。我以一个典型用户登录接口为例拆解一遍。假设登录接口定义如下POST请求地址是http://你的环境地址/api/login请求头需要Content-Type: application/json请求体是JSON{ username: admin, password: 123456 }在Postman里新建请求方法选POSTURL填接口地址Headers里面加Content-TypeBody选raw并选JSON格式填入上面的JSON发送即可。如果账号密码正确会返回一个包含Token的JSON响应。这里的关键点在于如何让后续接口自动带上这个Token。你可以在Tests标签页里写一段脚本从响应中提取Token并保存到环境变量const responseJson pm.response.json(); pm.environment.set(token, responseJson.data.token);后面再测试其他接口时在Authorization标签页选择Bearer TokenToken值填{{token}}或者在Headers里手动加一个键值对Authorization: Bearer {{token}}。这样Postman会自动从环境变量里读取Token不需要每次复制粘贴。如果服务端使用的是Cookie会话Postman也能处理。你发送登录请求后Postman会自动维护Cookie你可以在发送面板下方的Cookies标签里查看当前域名下保存的Cookie值。后续再调用同域名接口时Cookie会自动带上这就解决了“Postman怎么模拟登录调用接口”的痛点。REST接口测试中还有几个很实用的功能。接口的列表参数可以直接写在URL里比如/api/users?page1size20Postman的Params面板会自动帮你拼。基于Swagger/OpenAPI定义的接口可以直接导入生成集合省去手动建请求的重复劳动。如果你手头有一份导出的Postman JSON文件用Import功能选文件即可导入别人给你一个collection文件你也不用重新手敲。3.3 用环境变量和集合把接口组织起来测单个接口容易难的是把几十个接口组织成一套可以重复执行的测试集。Postman在这块的设计非常高效率。最基础的是环境变量。你可以创建三个环境dev、test、prod。每个环境里定义base_url、username、password、token等变量。请求URL直接写{{base_url}}/api/login切换环境时只需要在右上角环境选择器里点一下所有请求就指向了对应环境的地址。这才是接口测试工程化的第一步。变量优先级上要注意局部变量脚本里用pm.variables.set设置的优先级最高其次数据变量、环境变量最后才是全局变量。如果遇到变量不生效多半是优先级搞混了比如你同时在全局变量和环境变量里定义了同名变量最终读到的是环境变量里的值。断言也是强烈推荐你加上。刚开始用Postman的同事经常只看请求返回的颜色绿色就是通过红色就是失败这很不专业。用Tests脚本写几个断言每次发送后Postman会直接显示断言是否通过pm.test(状态码是200, function () { pm.response.to.have.status(200); }); pm.test(返回结果包含预期值, function () { const json pm.response.json(); pm.expect(json.data.loginState).to.eql(true); });在集合上点击Runner选择需要批量执行的接口设置迭代次数Postman就会自动跑完整个集合并在最后给出通过率报告。这对于发版前的回归测试非常有用能把整个手工点接口的过程压缩到几分钟。团队协作方面Collection可以右键导出为JSON文件放到Git仓库里备份也可以分享到Workspace让成员通过链接导入。导出接口文件这个需求很多人都在问核心意义就是接口测试资产要版本化管理否则拥有接口测试脚本的同事一离职文档和脚本就全断了。4. 常见问题与排查技巧实录4.1 发送请求后报错 Could not get any response这个问题是Postman用户遇到最多的。字面意思是“没有得到任何响应”但可能的原因非常多。我建议按下面的顺序排查第一确认URL是否正确。如果是本地服务看端口号有没有写错如果是远程服务确认路径是否完整比如漏了/api前缀或.asmx后缀。第二确认服务本身是否在运行。你把URL直接粘到浏览器里访问如果浏览器都打不开那问题不在Postman。很多同事排查半天最后发现本地服务根本没启动。第三关闭代理或正确配置代理。如果你在Postman的Settings里设置了代理而代理本身没开就会出现这个报错。尤其是公司电脑经常有默认代理配置建议先关掉或者通过系统代理访问一下看看。第四检查SSL证书。如果请求的地址是HTTPS且证书是自签名的Postman会因证书校验失败而拒绝请求。在Settings里关闭SSL certificate verification可以解决但是要注意这也会带来安全风险仅在测试环境建议这样做。还有一种情况是接口处理非常慢超过Postman默认120秒超时的话也会报类似错误。可以去Settings里调整timeout时长或者优化服务端性能。不要急着调大超时先搞清楚是服务慢还是网络慢。4.2 请求成功返回但服务端报SOAP FaultSOAP接口测试里最常见的错误是SOAP Fault。它本质上是服务端返回的“业务异常”或“解析异常”会包含faultcode、faultstring有时候还有detail节点。出现SOAP Fault先看faultstring内容。最常见的是“Server was unable to process request. --- 命名空间或对象引用未设置”。这往往是因为你的请求XML里方法节点的命名空间错了。比如WSDL里定义的是http://tempuri.org/你写的却是http://example.com/服务端宁可报错也不返回错误结果这就是规范的严格性。另一个常见问题是参数类型不匹配。比如WSDL定义参数是int你却在a节点里写了一个“abc”服务端在反序列化时就会抛异常。这种情况在接口文档不完善的项目里非常常见所以你在测试时必须先确认对应的WSDL里的类型定义。还有一类问题就是SOAPAction缺失或错误。某些古老的Java服务或.NET Framework服务会在反序列化前检查SOAPAction如果为空或者不匹配直接拒绝。你可以先从WSDL的soap:operation soapAction属性里找到准确的值然后填到Header里。需要注意有些版本要求SOAPAction用双引号包起来更保险的做法是直接复制WSDL里定义的值。如果你觉得手写SOAP容易错可以在SoapUI里用WSDL生成一个正确请求抓取原始XML内容再放到Postman中。这不丢人反而很高效。你不需要纠结必须用哪个工具关键是拿到正确的请求报文。4.3 Postman自身的那些坑免登录、汉化、密码重置Postman用久了会碰到一些工具本身的问题虽然不是接口逻辑问题但很容易卡住人。首先是登录问题。“Postman不用帐号可以用吗”这个问题被问得太多了。明确回答可以。直接关掉登录弹窗完全本地使用所有核心功能都正常。只是云同步、Team协作功能不可用。如果公司对数据安全有要求反而建议用免登录模式避免敏感接口数据被同步到云端。其次是汉化问题。前面说了Postman官方没有中文版社区汉化包必须严格匹配版本。有一个现象是很多人从一个网盘下载一个“破解版”说是中文版但实际版本特别老而且可能存在恶意代码。我更建议去官网下载最新版然后自己找对应的汉化包。如果你英文基础还行也可以直接用英文界面毕竟Postman的界面词汇就那么几个用一星期就熟了。再有一个是密码重置失败。如果你注册过Postman账号某天密码忘了点了Forgot Password但邮件一直收不到首先要确认当时注册的邮箱是不是你现在的邮箱其次去邮箱垃圾箱里翻一翻。如果实在收不到就不要在这个问题上耗时间了直接用本地免登录模式。Postman的本地数据都在你的电脑上不登录也不影响已有集合的使用。最后记得定期备份。Postman的Collection、Environment、Global Variables都可以导出。我的习惯是每次调整完接口集合后导出一份json文件保存到项目仓库的docs目录并写一句注释说明改动内容。这样即使电脑坏了、账号登不上、升级搞挂了都能快速恢复。4.4 测试时容易忽略的接口幂等性问题接口测试过程中有一个问题最容易在不知不觉间给测试环境“制造垃圾”那就是忽略了幂等性。所谓幂等就是同一个接口用同样的参数调用多次产生的副作用应该一致。打个比方查询用户信息是个天然幂等的操作调多少次结果都相同但创建一个支付订单就不是你发两次很可能生成了两笔订单。Postman的Runner在批量执行或调试时很容易因为脚本重试、请求超时重发导致服务端执行多次写入操作。遇到这类接口有几个处理思路一是确认接口是否实现了幂等校验比如通过订单号、请求唯一ID去重二是测试时尽量使用独立的测试账号和测试数据避免污染共享数据源三是记录请求序列号便于事后对照。我在实际项目中就遇到过一个批量导入接口在测试时连续点了几次Send结果测试库里多了一万多条重复记录排查了很久才搞清楚是导入逻辑没做去重。所以测试WebService接口尤其是带写入性质的接口一定要有“可能重复调用”的意识。每测完一轮看看数据是否被污染必要时清理或回滚。这不是Postman的功能问题而是接口测试方法论里必须考虑的一环。我在实际测试中的体会是Postman解决的是“如何把接口请求发出去、如何验证结果正确”这一层问题而真正决定接口质量的是你对业务逻辑、数据边界和异常分支的理解。工具怎么选没有绝对的答案但Postman足够覆盖绝大部分SOAP和REST接口测试场景。如果你能养成用环境变量管理地址列表、用Collections组织用例、用脚本自动提取上下文的习惯那么无论是处理老旧的WebService接口还是新型微服务接口都会从容很多。最后再分享一个小技巧测试过程中如果发现某个SOAP请求特别复杂可以把常用的XML模板保存在Postman的Snippets或环境变量里下次直接引用或者给不同的WebService接口在同一个Collection里分目录管理用命名前缀区分业务模块。接口测试不是一次性动作维护好你的Postman资产整个团队都会受益。
返回列表