本文链接: https://blog.csdn.net/riemann_/article/details/90708947
一, webservice 的概念
Web 是使应用程序可以与平台和编程语言无关的方式进行相互通信的一项技术. Web 服务是一个软件接口, 它描述了一组可以在网络上通过标准化的 xml 消息传递访问的操作. 它使用基于 xml 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换的数据. 一组以这种方式交互的 Web 服务在面向服务的体系结构 (Service-Oriented Architecture,SOA) 中定义了特殊的 Web 服务应用程序.
简单的说 WebService 是一个 SOA(面向服务的编程)的架构, 它是不依赖于语言, 不依赖于平台, 可以实现不同的语言 (通过 xml 描述) 间的相互调用, 通过 Internet 进行基于 Http 协议的网络应用间的交互. 通过 SOAP 在 Web 上提供的软件服务, 使用 WSDL 文件进行说明, 并通过 UDDI 进行注册.
xml:(Extensible Markup Language)扩展型可标记语言. 面向短期的临时数据处理, 面向万维网络, 是 SOAP 的基础.
SOAP:(Simple Object Access Protocol)简单对象存取协议. 是 xml Web Service 的通信协议. 当用户通过 UDDI 找到你的 WSDL 描述文档后, 他通过可以 SOAP 调用你建立的 Web 服务中的一个或多个操作. SOAP 是 xml 文档形式的调用方法的规范, 它可以支持不同的底层接口, 像 HTTP(S)或者 SMTP.
WSDL:(Web Services Description Language) WSDL 文件是一个 xml 文档, 用于说明一组 SOAP 消息以及如何交换这些消息. 大多数情况下由软件自动生成和使用.
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对 Web 服务供应商和使用者的新项目. 在用户能够调用 Web 服务之前, 必须确定这个服务内包含哪些商务方法, 找到被调用的接口定义, 还要在服务端来编制软件, UDDI 是一种根据描述文档来引导系统查找相应服务的机制. UDDI 利用 SOAP 消息机制 (标准的 xml/HTTP) 来发布, 编辑, 浏览以及查找注册信息. 它采用 xml 格式来封装各种不同类型的数据, 并且发送到注册中心或者由注册中心来返回需要的数据.
二, webservice 接口测试
测试 webservice 接口, 可以使用 soapUI 来进行测试, 下面简单用 soapUI 来调用 webservice 接口:
1. 打开 soapUI, 新建一个 SOAP 工程:
2. 我们以天气预报的 wsdl 地址为例, 导入 soapUI 查看其中的所有接口信息;
wsdl 地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
3, 查看接口及报文, 输入参数直接进行调用
发送报文:
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:Web="http://WebXml.com.cn/">
- <soapenv:Header/>
- <soapenv:Body>
- <Web:getSupportCity>
- <!--Optional:-->
- <Web:byProvinceName>
- 北京
- </Web:byProvinceName>
- </Web:getSupportCity>
- </soapenv:Body>
- </soapenv:Envelope>
- 1 2 3 4 5 6 7 8 9
返回报文:
- <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <SOAP:Body>
- <getSupportCityResponse xmlns="http://WebXml.com.cn/">
- <getSupportCityResult>
- <string>
- 北京 (54511)
- </string>
- <string>
- 上海 (58367)
- </string>
- <string>
- 天津 (54517)
- </string>
- <string>
- 重庆 (57516)
- </string>
- </getSupportCityResult>
- </getSupportCityResponse>
- </SOAP:Body>
- </SOAP:Envelope>
- 1 2 3 4 5 6 7 8 9 10 11 12
1, 根元素: Envelope.
2,Header 元素:: 不是强制出现, 由程序员控制, 主要用于携带一些额外的信息, 比如用户名, 密码
3,Body: 调用正确, body 元素内容应该遵守 WSDL 要求的格式.
三, HTTP 接口
Http 协议是建立在 TCP 协议基础之上的, 当浏览器需要从服务器获取网页数据的时候, 会发出一次 Http 请求. Http 会通过 TCP 建立起一个到服务器的连接通道, 当本次请求需要的数据完毕后, Http 会立即将 TCP 连接断开, 这个过程是很短的. 所以 Http 连接是一种短连接, 是一种无状态的连接.
HTTP 协议的主要特点可概括如下:
1. 支持客户 / 服务器模式.
2. 简单快速: 客户向服务器请求服务时, 只需传送请求方法和路径. 请求方法常用的有 GET,HEAD,POST. 每种方法规定了客户与服务器联系的类型不同. 由于 HTTP 协议简单, 使得 HTTP 服务器的程序规模小, 因而通信速度很快.
3. 灵活: HTTP 允许传输任意类型的数据对象. 正在传输的类型由 Content-Type 加以标记.
4. 无连接: 无连接的含义是限制每次连接只处理一个请求. 服务器处理完客户的请求, 并收到客户的应答后, 即断开连接. 采用这种方式可以节省传输时间.
5. 无状态: HTTP 协议是无状态协议. 无状态是指协议对于事务处理没有记忆能力. 缺少状态意味着如果后续处理需要前面的信息, 则它必须重传, 这样可能导致每次连接传送的数据量增大. 另一方面, 在服务器不需要先前信息时它的应答就较快.
URL 解析
在 WWW 上, 每一信息资源都有统一的且在网上唯一的地址, 该地址就叫 URL(Uniform Resource Locator, 统一资源定位符), 它是 WWW 的统一资源定位标志, 就是指网络地址. HTTP 协议工作于客户端 - 服务端架构之上. 浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 Web 服务器发送所有请求. Web 服务器根据接收到的请求后, 向客户端发送响应信息.
URL 由三部分组成: 资源类型, 存放资源的主机域名, 资源文件名.
URL 的一般语法格式为 (带方括号[] 的为可选项):
protocol ?/ hostname[:port] / path / [;parameters][?query]#fragment
以下面的 URL 为例:
http://blog.sina.com.cn/s/blog_537ad6610102xtb1.html?tj=hist
1, 协议部分, 代表页面使用的是 http 协议, 在 Internet 中可以使用多种协议, 如 HTTP,FTP 等等. 在 "HTTP" 后面的 "//" 为分隔符;
2, 域名部分, blog.sina.com.cn, 也可以使用 IP 地址作为域名使用如: 192.168.55.14:8080, 其中 8080 为端口, 域名和端口之间使用 ":" 作为分隔符. 端口不是一个 URL 必须的部分, 如果省略端口部分, 将采用默认端口 80/tcp;
3, 虚拟目录部分, 从域名后的第一个 "/" 开始到最后一个 "/" 为止, 是虚拟目录部分. 虚拟目录也不是一个 URL 必须的部分. 本例中的虚拟目录是 "/s/"
4, 文件名部分: 从域名后的最后一个 "/" 开始到 "?" 为止, 是文件名部分, 如果没有 "?", 则是从域名后的最后一个 "/" 开始到 "#" 为止, 是文件部分, 如果没有 "?" 和 "#", 那么从域名后的最后一个 "/" 开始到结束, 都是文件名部分. 本例中的文件名是 "blog_537ad6610102xtb1.html". 文件名部分也不是一个 URL 必须的部分, 如果省略该部分, 则使用默认的文件名
5, 锚部分: 从 "#" 开始到最后, 都是锚部分. 锚部分也不是一个 URL 必须的部分(可以理解为定位)
6, 参数部分: 从 "?" 开始到 "#" 为止之间的部分为参数部分, 又称搜索部分, 查询部分. 本例中的参数部分为 "7. 参数部分: 从"?"开始到"#"为止之间的部分为参数部分, 又称搜索部分, 查询部分. 本例中的参数部分为"boardID=5&ID=24618&page=1". 参数可以允许有多个参数, 参数与参数之间用"&"作为分隔符.". 参数可以允许有多个参数, 参数与参数之间用 "&" 作为分隔符.
四, HTTP 协议结构
HTTP 请求消息
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:
请求行(request line), 请求头部(header), 空行和请求数据四个部分组成.
格式如下:
<request-line>
<headers>
<blank line>
[<request-body>]
1
2
3
4
1, 请求行
请求行由请求方法字段, URL 字段和 HTTP 协议版本字段 3 个字段组成, 它们用空格分隔. 例如, GET /index.HTML HTTP/1.1.
HTTP 协议的请求方法有 GET,POST,HEAD,PUT,DELETE,OPTIONS,TRACE,CONNECT.
最常用的方法有:
GET 方法: 在浏览器的地址栏中输入网址的方式访问网页时, 浏览器采用 GET 方法向服务器获取资源,
POST 方法要求被请求服务器接受附在请求后面的数据, 常用于提交表单.
2, 请求头部
请求头部由关键字 / 值对组成, 每行一对, 关键字和值用英文冒号 ":" 分隔. 请求头部通知服务器有关于客户端请求的信息, 典型的请求头有:
User-Agent: 产生请求的浏览器类型.
Accept: 客户端可识别的内容类型列表.
Host: 请求的主机名, 允许多个域名同处一个 IP 地址, 即虚拟主机.
3, 空行
最后一个请求头之后是一个空行, 发送回车符和换行符, 通知服务器以下不再有请求头.
4, 请求正文
请求数据不在 GET 方法中使用, 而是在 POST 方法中使用. POST 方法适用于需要客户填写表单的场合. 与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length.
HTTP 响应消息
在接收和解释请求消息后, 服务器返回一个 HTTP 响应消息.
HTTP 响应也是由三个部分组成, 分别是: 状态行, 消息报头, 响应正文
报文格式:
<status-line>
<headers>
<blank line>
[<response-body>]
1
2
3
4
1, 状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中, HTTP-Version 表示服务器 HTTP 协议的版本; Status-Code 表示服务器发回的响应状态代码; Reason-Phrase 表示状态代码的文本描述.
状态代码有三位数字组成, 第一个数字定义了响应的类别, 且有五种可能取值:
1xx: 指示信息 - 表示请求已接收, 继续处理
2xx: 成功 - 表示请求已被成功接收, 理解, 接受
3xx: 重定向 - 要完成请求必须进行更进一步的操作
4xx: 客户端错误 - 请求有语法错误或请求无法实现
5xx: 服务器端错误 - 服务器未能实现合法的请求
常见状态代码, 状态描述, 说明:
- 200 OK // 客户端请求成功
- 400 Bad Request // 客户端请求有语法错误, 不能被服务器所理解
- 401 Unauthorized // 请求未经授权, 这个状态代码必须和 WWW-Authenticate 报头域一起使用
- 403 Forbidden // 服务器收到请求, 但是拒绝提供服务
- 404 Not Found // 请求资源不存在, eg: 输入了错误的 URL
- 500 Internal Server Error // 服务器发生不可预期的错误
- 503 Server Unavailable // 服务器当前不能处理客户端的请求, 一段时间后可能恢复正常
- eg:HTTP/1.1 200 OK (CRLF)
2, 响应报头
响应头用于描述服务器的基本信息, 以及数据的描述, 服务器通过这些数据的描述信息, 可以通知客户端如何处理等一会儿它回送的数据.
3, 响应正文
响应体就是响应的消息体, 如果是纯数据就是返回纯数据, 如果请求的是 HTML 页面, 那么返回的就是 HTML 代码, 如果是 JS 就是 JS 代码
post 与 get 的区别
get 请求: 向服务端获取请求; 数据放在 URL 里, 有长度限制;
post 请求: 向服务端发送请求; 数据放在 body 里, 无长度限制; 更安全
http 接口返回 JSON 串: 一种通用的数据类型
接口的返回值;
- {
- "error_code": 0,
- "stu_info": [
- {
- "id": 1,
- "name": "灏忛粦",
"sex": 男 ","age": 18,"addr":" 北京市海淀区 ","grade":" 三年二班 ","phone":"18612532941","gold": 11212
- }
- ]
- }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
测试接口调用演练
get 接口
请求 URL http://api.nnzhp.cn/api/user/stu_info
请求方式 get
请求参数
参数名 必选 类型 说明
stu_name 是 string 学生姓名
1, 直接用浏览器调用
2, 使用 postman 调用
可以看到 postman 选择 get 方法的时候, body 是禁用状态, get 方法的 http 接口请求, 一般数据都放到 URL 中.
返回的方式同样也是 JSON 串的形式;
3, 使用 jmeter 进行 get 方法的调用测试
创建线程组
添加 HTTP 请求
输入域名, URL, 选择请求方法, 添加 key
添加查看结果树
执行接口
可以在查看结果树中查看执行结果及返回数据
post 请求接口
登录接口
请求 URL http://api.nnzhp.cn/api/user/login
请求方式 post
请求参数 参数为 key-value 形式
参数名 必选 类型 说明
username 是 string 用户名
passwd 是 string 密码
登陆用户名: niuhanyang
密码: aA123456
返回参数说明
参数名 类型 说明
error_code int 错误编码, 0 为操作成功
login_info object 登录对象信息
userId int 用户 id
sign string 签名
login_time string 登录时间
1,postman 进行调用
post 方法的参数是放在 body 中的, 可以看到参数放到 URL 中是无效的
把参数放到 body 中在进行提交
放到 body 中, 以 key-value 的形式进行传参, 返回 JSON 串的形式, 参照返回参数说明, 可以看到登陆成功.
2, 用 jmeter 进行调用测试
打开 jmeter ->添加 ->threads->线程组
在线程组中添加 ->sampler->HTTP 请求
输入域名, URL, 选择方法为 post , 输入参数
执行并查看结果返回值
添加学生信息接口
请求 URL:http://api.nnzhp.cn/api/user/add_stu
请求方式 post
参数 , 入参是 JSON 类型
参数名 必选 类型 说明
name 是 string 学生姓名
grade 是 string 班级
phone 是 string 电话
sex 否 string 性别, 如果不传, 默认为男
age 否 string 年龄 , 不传默认为 18
add 否 string 地址, 如果不传默认为北京市昌平区
返回参数说明
参数名 类型 说明
error_code int 错误编码, 1000 为操作成功
msg string 提示信息
如上述描述, 入参形式为 JSON 的方式, 则使用 key-value 的形式进行传参就不行了, 如下:
现在我们用正确的入参方式进行调用
1,postman 调用
在 postman 中, 选择方法为 post, 输入 URL 地址, 在 body 中选择 raw , 输入 JSON 串格式的参数
2, 使用 jmeter 调用接口
我们下面看一下 jmeter 如何进行调用
创建一个 http 请求, 输入域名, 路径, 方法为 post, 在 body data 中输入 JSON , 然后执行
可以在查看结果树中的请求项中查看请求报文内容
在响应数据中查看响应结果, 执行成功
学生金币充值
请求 URL:http://api.nnzhp.cn/api/user/gold_add
请求方式 post
参数 ,
该接口有权限验证, 需要 admin 用户才可以做操作, 需要添加 cookie
cookie 中 key 为登录的用户名, value 从登录接口中获取, 登陆成功之后会返回 sign
参数名 必选 类型 说明
stu_id 是 int 学生 id
gold 是 int 金币数量
返回参数说明
参数名 类型 说明
error_code int 错误编码, 0 为操作成功
msg string 提示信息
如上述描述, 入参形式需要添加 cookie
1,postman 进行调用, 添加 cookie 的方式
cookie 说的直白点就是保存在用户浏览器端的一个键值对
提到 cookie 肯定不能少了 session, 什么是 session 呢, session 就是保存在服务器的一个键值对, 一般 session 都是存在缓存里面, 因为要经常用到, 要提升性能的话直接把 session 放到内存里面.
首先我们通过 "获取学生信息" 接口查看到学生的 id 信息, 然后通过 "登录" 接口, 获取签名的值如下: 以 test 用户为例:
查询出 ID=2341
sign 值为: cd2b43f1688e472e3a516b5a2c6831e8
现在为学生添加金币
2, 用 jmeter 进行接口的调用
用 jmeter 测试带 cookie 的 http 请求需要添加 http cookie 管理器
我们先看一下添加 cookie 的场合进行执行
可以看到没有添加 cookie 的场合, 执行不成功
现在我们添加 httpcookie 管理器, 右键添加 ->配置元件 ->HTTP cookie 管理器
添加 cookie 的值
执行, 查看请求的数据
获取所有学生信息
请求 URL:http://api.nnzhp.cn/api/user/all_stu
请求方式 get
参数 , 需要添加 header 信息, key 为 Referer value 为 http://api.nnzhp.cn/
返回参数说明
参数名 类型 说明
error_code int 错误编码, 0 为操作成功
all_stu list 提示信息
1, 我们看一下不添加 header, 直接用浏览器地址栏访问的结果
如下, 不添加 header 访问, 提示来路不正确
2, 用 postman 进行调用, 添加 header 信息, 并进行调用
执行, 结果显示所有的学生用户信息
3, 用 jmeter 进行调用测试
添加 http 请求
右键添加 ->配置元件 ->http 信息头管理器
执行结果成功, 显示学生信息
文件上传类型
请求 URL:http://api.nnzhp.cn/api/file/file_upload
请求方式 post
参数
参数名 必选 类型 说明
file 是 file 文件
返回参数说明
参数名 类型 说明
error_code int 错误编码, 0 为操作成功
msg string 提示信息
1, 用 postman 进行调用, 输入 URL 地址, key 的类型选择 file 类型
选择文件进行上传
执行操作成功
2, 使用 jmeter 进行调用
执行, 操作成功
----------------
来源: http://www.bubuko.com/infodetail-3298075.html