一、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>
返回报文:
<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、根元素: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为例:
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、请求行
请求行由请求方法字段、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、状态行格式如下:
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 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进行调用
执行,操作成功
好了先这么多,期待后续。。。
from: https://www.cnblogs.com/phoebes/p/8029464.html