JMeter基础系列(十四) JMeter测试Web服务

14.1 Web服务简介

什么是Web服务

【Web服务】即Web Service。Web服务是一种服务导向架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。

根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。

Web服务三要素

* SOAP

一个基于XML的可扩展消息信封格式,需同时绑定一个传输用协议。这个协议通常是HTTP或HTTPS,但也可能是SMTP或XMPP等其他协议。

SOAP协议有SOAP1.1与SOAP1.2两种主要的版本,SOAP可以运行在任何其他应用协议之上。

* WSDL

一个XML格式文档,用以描述服务端口访问方式和使用协议的细节。通常用来辅助生成服务器和客户端代码及配置信息。

可以看成是Web服务的使用说明书。

* UDDI

一个用来发布和搜索WEB服务的协议,应用程序可借由此协议在设计或运行时找到目标WEB服务。UDDI旨在将全球的WEB服务资源进行共享,促进全球经济合作。但是使用WEB服务并不是必须要使用UDDI,因为很多时候使用者已经知道了WEB服务地址就可以进行调用。

这些标准由这些组织制订:W3C负责XML、SOAP及WSDL;OASIS负责UDDI。

SOAP

* SOAP构建模块

一条SOAP消息就是一个普通的XML文档,包含下列元素:
必需的Envelope元素,可把此XML文档标识为一条SOAP消息
可选的Header元素,包含头部信息
必需的Body元素,包含所有的调用和响应信息
可选的Fault元素,提供有关在处理此消息所发生错误的信息
所有以上的元素均被声明于针对SOAP封装的默认命名空间中:
http://www.w3.org/2001/12/soap-envelope
以及针对SOAP编码和数据类型的默认命名空间:
http://www.w3.org/2001/12/soap-encoding

* SOAP消息组成

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

    <soap:Header>
      ...
    </soap:Header>

    <soap:Body>
      ...
      <soap:Fault>
         ...
      </soap:Fault>
      ...
    </soap:Body>

</soap:Envelope>

* SOAP消息例子

股票查询服务,根据股票名称查询股票价格,返回股票价格。
1.SOAP消息请求:
POST /StockQuote HTTP/1.1
Host: example.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "http://example.com/GetLastTradePrice"

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <m:TradePriceRequest xmlns:m="http://example.com/stockquote.xsd">
      <tickerSymbol>MSFT</tickerSymbol >
    </m:TradePriceRequest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

2.SOAP消息响应:
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  <SOAP-ENV:Body>
    <m:TradePriceResult xmlns:m=" http://example.com/stockquote.xsd ">
      <price>74.5</price>
    </m:TradePriceResult >
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

WSDL

* WSDL文档结构

image
WSDL元素结构示意图如下图所示:
image
其中,
1.Types是一个数据类型定义的容器,包含了所有在消息定义中需要的XML元素的类型定义。
2.Message具体定义了在通信中使用的消息的数据结构,Message元素包含了一组Part元素,
  每个Part元素都是最终消息的一个组成部分,每个Part都会引用一个DataType来表示它的结构。
  Part元素不支持嵌套。
3.PortType具体定义了一种服务访问入口的类型,何谓访问入口的类型呢?
  就是传入/传出消息的模式及其格式。一个PortType可以包含若干个Operation,
  而一个Operation则是指访问入口支持的一种类型的调用。
以上三种结构描述了调用Web服务的抽象定义,这三部分与具体Web服务部署细节无关,是可复用的描述(每个层次都可以复用)。
4.Service描述的是一个具体的被部署的Web服务所提供的所有访问入口的部署细节,
  一个Service往往会包含多个服务访问入口,而每个访问入口都会使用一个Port元素来描述。
5.Port描述的是一个服务访问入口的部署细节,包括通过哪个Web地址(URL)来访问,应当使用怎样的消息调用模式来访问等。
  其中消息调用模式则是使用Binding结构来表示。
6.Binding结构定义了某个PortType与某一种具体的网络传输协议或消息传输协议相绑定,
  从这一层次开始,描述的内容就与具体服务的部署相关了。比如可以将PortType与SOAP/HTTP绑定,
  也可以将PortType与MIME/SMTP相绑定等。

* WSDL端口

<portType>元素是最重要的WSDL元素。它可描述一个Web service可被执行的操作以及相关的消息。可以把<portType>元素比作传统编程语言中的一个函数库(或一个模块,或一个类)。端口包含如下类型:

image
1.一个One-way操作的例子:
<message name="newTermValues">
  <part name="term" type="xs:string"/>
  <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
  <operation name="setTerm">
    <input name="newTerm" message="newTermValues"/>
  </operation>
</portType >

在这个例子中,端口"glossaryTerms"定义了一个名为"setTerm"的one-way操作。
这个"setTerm"操作可接受新术语表项目消息的输入,这些消息使用一条名为"newTermValues"的消息,
此消息带有输入参数"term"和"value"。不过,没有为这个操作定义任何输出。

2.一个Request-response操作的例子:
<message name="getTermRequest">
  <part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
  <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
  <operation name="getTerm">
    <input message="getTermRequest"/>
    <output message="getTermResponse"/>
  </operation>
</portType>

在这个例子中,端口“glossaryTerms”定义了一个名为“getTerm”的request-response操作。
“getTerm”操作会请求一个名为“getTermRequest”的输入消息,
此消息带有一个名为“term”的参数,并将返回一个名为 “getTermResponse”的输出消息,
此消息带有一个名为“value”的参数。

* WSDL绑定

一个绑定的例子:
<message name="getTermRequest">
  <part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
  <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
  <operation name="getTerm">
    <input message="getTermRequest"/>
    <output message="getTermResponse"/>
  </operation>
</portType>

<binding type="glossaryTerms" name="b1">
   <soap:binding style="document"
   transport="http://schemas.xmlsoap.org/soap/http" />
   <operation>
     <soap:operation soapAction="http://example.com/getTerm"/>
     <input><soap:body use="literal"/></input>
     <output><soap:body use="literal"/></output>
  </operation>
</binding>

binding元素有“name”和“type”两个属性。“name”属性定义binding的名称,
而“type”属性指向binding的端口,在这个例子中是“glossaryTerms”端口。
soap:binding元素有“style”和“transport”两个属性。
“style”属性可取值为“rpc”或“document”。在这个例子中我们使用“document”。
“transport”属性定义SOAP使用的协议,在这个例子中使用HTTP。
operation元素定义了每个端口提供的操作符。对于每个操作,相应的SOAP行为都需要被定义。
同时必须知道如何对输入和输出进行编码。在这个例子中使用了“literal”。

14.2 应用案例

案例说明

这里以天气预报服务为例。

400个国内外主要城市天气预报Web服务访问地址:
Endpoint: http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx
Disco: http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx?disco
WSDL: http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

操作: getSupportCity
功能: 查询本天气预报Web Services支持的国内外城市或地区信息
请求方式: HTTP/POST
接口地址: http://ws.webxml.com.cn/WebServices/WebServices/WeatherWebService.asmx
输入参数: byProvinceName = 指定的洲或国内的省份,若为ALL或空则表示返回全部城市
返回数据: 一个一维字符串数组String(),结构为:城市名称(城市代码)

操作步骤

1.添加线程组;
2.添加HTTP请求取样器并配置;
3.在取样器节点下添加“HTTP Header Manager”并配置;
4.在取样器节点下添加查看结果树;
5.执行看结果。
* 使用SOAP1.1时配置测试
HTTP请求配置:
1.Server Name or IP: ws.webxml.com.cn
2.Method: POST
3.Path: /WebServices/WebServices/WeatherWebService.asmx
4.Content encoding: utf-8
5.Body Data:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getSupportCity xmlns="http://WebXml.com.cn/">
      <byProvinceName>湖南</byProvinceName>
    </getSupportCity>
  </soap:Body>
</soap:Envelope>
其中"湖南"为传入的参数值(byProvinceName为参数名)
image
POST请求传递数据为SOAP消息,格式为XML。需要将SOAP消息放入Body Data中发送给服务器,
并且需要告诉服务器对应的Content-Type。
故需要添加一个“HTTP Header Manager”配置元件,在其中添加两个首部“Content-Type”与“SOAPAction”,
其中“SOAPAction”用来标识SOAP HTTP请求的目的地,其值是个URI地址。
在SOAP1.1中这个首部若其值为空串(""),表示SOAP消息的目的地由HTTP请求的URI标识;
无值则表示没有指定这条消息的目的地。

1.Content-Type: text/xml; charset=utf-8
2.SOAPAction: "http://WebXml.com.cn/getSupportCity"
配置如下图所示:
image
* 使用SOAP1.2时配置测试
HTTP请求配置只需要将Body Data修改,其他配置项保持不变:
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getSupportCity xmlns="http://WebXml.com.cn/">
      <byProvinceName>string</byProvinceName>
    </getSupportCity>
  </soap12:Body>
</soap12:Envelope>

需要修改"HTTP Header Manager"配置元件,在SOAP1.2规范中,
SOAPAction首部被Content-Type的“action”属性所取代,但其作用和工作原理都没有变化。

Content-Type: application/soap+xml;charset=UTF-8;action="http://WebXml。com。cn/getSupportCity"
配置如下图所示:
image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容