前言

HTTP:超文本传输协议,是用于从WWW服务器传输超文本到本地浏览器的传输协议。 HTTP协议是一种无状态协议,主要包含请求和相应两大部分。



 

请求(Request)

get请求示范:

GET http://wthrcdn.etouch.cn/weather_mini?citykey=101070101

请求是我们发送给接口的数据对象,包含接口地址(URL),请求方法,参数,请求头(Headers), Cookies, 数据等 真实抓包一个请求:

【Python接口自动化测试】HTTP 协议_接口测试

 

 

 请求原始格式-GET(Raw格式:Fiddler抓包得到)



1 GET http://wthrcdn.etouch.cn/weather_mini?citykey=101070101 HTTP/1.1
2 Host: wthrcdn.etouch.cn
3 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
5 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
6 Accept-Encoding: gzip, deflate
7 Connection: keep-alive
8 Upgrade-Insecure-Requests: 1


  • 第1行: 请求方法 接口地址 HTTP协议版本
  • 第2-N行:请求headers(如果有Cookie,最后一行为Cookie)
  • 空一行
  • 请求数据(POST等方法使用,此处为空)

POST请求示范:

请求原始格式-POST请求(Raw格式:Fiddler抓包得到)



POST http://openapi.tuling123.com/openapi/api/v2 HTTP/1.1
Content-Type: application/json
cache-control: no-cache
Postman-Token: 1a39439e-61c8-4e59-82a1-736a362c5962
User-Agent: PostmanRuntime/7.2.0
Accept: */*
Host: openapi.tuling123.com
accept-encoding: gzip, deflate
content-length: 468
Connection: keep-alive

{
"reqType":0,
"perception": {
"inputText": {
"text": "附近的酒店"
},
"inputImage": {
"url": "imageUrl"
},
"selfInfo": {
"location": {
"city": "北京",
"province": "北京",
"street": "信息路"
}
}
},
"userInfo": {
"apiKey": "ec961279f453459b9248f0aeb6600bbe",
"userId": "206379"
}
}


URL​

URL:统一资源定位符,接口的访问地址(包含服务器地址+接口地址)

URL组成格式




协议\\: 服务器地址:端口号\资源路径?参数1=值1&参数2=值2



如:https://www.sojson.com/open/api/weather/json.shtml?city=北京


注意:?号要使用英文?,不能使用中文?

URL编码

URL编码是一种浏览器用来打包请求参数及表单参数的格式, 参数和参数之间使用&分割,非ASCII码使用%加16进制编码替换

如:​​https://www.sojson.com/open/api/weather/json.shtml?city=北京​

编码后为:​​https://www.sojson.com/open/api/weather/json.shtml?city=%E5%8C%97%E4%BA%AC​



链接:URL编码/解码工具(http://tool.chinaz.com/Tools/urlencode.aspx)


 

请求方法


序号

方法

描述

1

GET

请求指定的页面信息,并返回实体主体

2

POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)数据被包含在请求体中

3

HEAD

类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

4

PUT

从客户端向服务器传送的数据取代指定的文档的内容

5

DELETE

请求服务器删除指定的页面

6

CONNECT

预留给能够将连接改为管道方式的代理服务器

7

OPTIONS

允许客户端查看服务器的性能

8

TRACE

回显服务器收到的请求,主要用于测试或诊断


GET请求和POST请求的区别

  • GET请求:
  • GET请求可被缓存
  • GET请求保留在浏览器历史记录中
  • GET请求可被收藏为书签
  • GET请求不应在处理敏感数据时使用
  • GET请求有长度限制
  • GET请求只应当用于取回数据
  • POST请求:
  • POST请求不会被缓存
  • POST请求不会保留在浏览器历史记录中
  • POST不能被收藏为书签
  • POST请求对数据长度没有要求

请求参数(URL参数)​



如:https://www.sojson.com/open/api/weather/json.shtml?city=北京


  • 中的​​city=北京​​,向接口传递一个参数“city”,参数值为“北京”
  • 不同的参数之间用&隔开,非ASCII码参数会自动url encode

请求Headers(请求头)​

常见Headers

【Python接口自动化测试】HTTP 协议_接口测试_02

请求数据(又称为Request Body 或 Data)​

请求数据类型(Content-Type)(重点)

  • application/x-www-form-urlencoded: 网页表单格式(默认)
  • application/json:REST接口常用格式
  • text/xml:xml格式,RPC接口,Dubbo接口常用格式
  • test/html: html格式
  • multipart/form-data: 混合表单,支持上传图片

数据编码

  • ASCII码: 单字节,美国信息交换标准码, 包含数字,字母,英文标点及一些控制字符
  • ISO-8859-1:又称Latin1,单字节,向下兼容ASCII,用于支持部分于欧洲使用的语言
  • ANSI编码:单字节表示英文,双字节表示汉字,对ASCII的扩展,不同的国家和地区制定了不同的标准,中文中的GBK,GB2312属于ANSI编码
  • Unicode编码: 采用二个字节编码(英文和中文的字符都以双字节存放),与ANSI码不兼容
  • UTF-8:是目前互联网上使用最广泛的一种Unicode 编码方式,又称万国码

指定请求数据编码(解决中文乱码):
请求Headers设置Content-Type: application/json; charset=utf-8

  • Base64: 一种用64个字符来表示任意二进制数据的方法。
  • Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。
  • 而且base64特别适合在http,mime协议下快速传输数据。

【Python接口自动化测试】HTTP 协议_json_03

参考:​​Base64编码及其作用​

响应(Response)​

接口返回的信息,包含HTTP状态码,响应头和相应信息

原始相应数据(Raw格式,Fiddler抓包)


Copy

HTTP/1.1 200 OK
Date: Thu, 23 Aug 2018 06:32:26 GMT
Transfer-Encoding: chunked
Connection: keep-alive

{"intent":{"actionName":"","code":10005,"intentName":"","parameters":{"lon":"","checkout_date":"2018-08-25","star":"0","city":"北京","days":"1","order":"","price_range":"","nearby_place":"酒店","brand":"","checkin_date":"2018-08-24","place":"信息路","lat":"","needgeo":"0"}},"results":[{"groupType":1,"resultType":"url","values":{"url":"http://m.elong.com/hotel/0101/nlist/#indate=2018-08-24&outdate=2018-08-25&keywords=%E4%BF%A1%E6%81%AF%E8%B7%AF"}},{"groupType":1,"resultType":"text","values":{"text":"亲,已帮你找到相关酒店信息"}}]}


常见的响应格式

  • html
  • json
  • xml

响应编码:有时需要根据不同的编码来正确解析响应内容

HTTP状态码​

  • 1** 信息,服务器收到请求,需要请求者继续执行操作
  • 2** 成功,操作被成功接收并处理
  • 3** 重定向,需要进一步的操作以完成请求
  • 4** 客户端错误,请求包含语法错误或无法完成请求
  • 5** 服务器错误,服务器在处理请求的过程中发生了错误

常见HTTP响应码

  • 200: 成功
  • 301/302: 请求重定向到另外一个接口
  • 400: 请求语法错误
  • 403:资源没有访问权限
  • 404:资源不存在(有可能是请求url错误或参数不正确)
  • 405:请求方法不被允许(比如接口只允许Post,使用Get请求接口)
  • 500:服务器内部错误(通常是服务器挂了或接口Bug)
  • 502: 网关失效
  • 504: 网关请求超时

HTTP与HTTPS​

HTTP协议传输的数据都是未加密的,HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。

HTTPS和HTTP的区别

  • HTTPS协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  • HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • HTTP的连接很简单,是无状态的;HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

Cookie和Session​

  • **Cookie/Cookies: **是指某些网站为了辨别用户身份进行session跟踪储存在用户本地终端上的数据(通常经过加密)。
  • Session:服务端为客户端访问所建立和维持的会话,通常会生成一个唯一的id,会话有一定的有效期。
    由于HTTP是无状态的,即服务器不知道用户上一次做了什么,默认也无法识别用户身份。
    比较流行的做法是:
  • 用户访问时服务端建立会话(Session)
  • 将会话id(Session ID)随响应返回,并保存在客户端的Cookies里
  • 后续的访问中,服务器通过辨识,客户端请求时携带的Cookies内容来识别用户

【Python接口自动化测试】HTTP 协议_服务器_04

【Python接口自动化测试】HTTP 协议_服务器_05

Cookie和Session的区别

  • cookie是存在客户端(浏览器)的进程内存中和客户端所在的机器硬盘上
  • cookie只能能够存储少量文本,大概4K大小
  • cookie是不能在不同浏览器之间共享
  • Session存在服务器端,存在网站进程的内存中
  • Session在初次设置session的时候,会在session池中实例化一个session对象,以sessionid 的值作为key,同时会将key以cookie的形式保存到客户端的内存中
  • Session的作用域只存在当前浏览器的会话中,当浏览器关闭以后就会将sessionid丢失,但是服务器的Session对象要20分钟以后才会回收

授权与加密​

常见的接口安全策略:

  1. Session/Cookie机制: 即需要登录,登录后可访问各个接口,最常用的一种策略,适用于内部接口。
  2. 固定appid模式: 用户注册时会生成一个唯一的appid,用户调用接口时需要携带appid,适用于公开接口,安全性较差。
  3. 动态token模式: token即身份令牌,用户访问接口需要使用个人appid临时申请一个token,token有一定有效期,适用于公开接口,安全性较appid模式好。
  4. 开放协议: Basic Auth/ Oauth1.0 / Oauth2.0: 适用于开放接口。
  5. 数字签名: 将所有请求参数及参数值进行排列拼接,加上用户私钥,再进行Md5或其他加密生成一个请求的签名(sign),请求是需要携带签名,服务器收到请求后,会对请求重新计算签名并核实与请求所携带签名是否一致。安全性较高,可以有效防止请求被篡改。适用于内部接口及微服务接口。

常见的加密算法

在接口数据传输过程中常对一些敏感数据(如密码)进行Base64编码或MD5加密,以增加安全性。

加密算法分为对称式加密算法和非对称式加密算法,对称式加解密使用同一个秘钥,非对称式使用不同的秘钥。

  • 对称式加密
  • DES: 数据加密标准,速度较快,适用于加密大量数据的场合
  • AES: 高级加密标准,速度快,安全级别高
  • 非对称式加密
  • RSA: 是一个支持变长密钥的公共密钥算法, 分公钥和私钥,SSH协议使用该算法
  • MD5: 最常用的一种加密方法,是一种摘要算法。

缓存​

HTTP 缓存机制作是 web 性能优化的重要手段,当用户第一次请求服务器资源时,服务器将资源缓存到客户端本地,在一定时间内(缓存有效期内)当用户再次向服务器请求同样的资源时,可以直接从缓存中读取,而不用从服务器下载。

接口测试中缓存相关注意点

  • 在更新或调试接口是,注意是否需要清理缓存(或临时禁用缓存)
  • 缓存有一定的有效期
  • 接口性能测试中会关注缓存的命中率