笔记1 - Web API 的概念和http协议

2023-11-06

接口定义

接口是个比较泛义上的概念,主要表示系统对外交互的部分,比如电源插座是电器和电能之间的接口,图形界面是应用软件和用户的接口,医院挂号大厅是医生和病人之间的接口

 

webAPI

我们要学习的接口概念缩小到web系统提供的对外消息交互接口,通过发送对应的请求给服务器,服务器会返回相应的结果,因为其调用模式非常像编程语言中的API,所以web消息交互接口又叫webapi。

 

Web服务接口

目前web服务接口都是基于http协议传递消息

通常大家所说的,web服务接口,websevice ,webapi其实表示的都是一个意思

主流的http消息体类型主要分为两种

SOAP UI: 使用XML格式传输消息体,由于阅读性差,同等信息量传输耗费的资源多,因为标签

 

REST: 定义了一种消息传输的风格,规定了消息体和URL的请求格式,同时也规定服务端的开发设计架构。本质上还是用http协议传输消息,至于这种风格具体是什么,怎么就确定我开发的系统符合REST定义的风格规范,很多做了很多年服务端开发的人员也不一定能说清楚,由于没有强制的要求,即使开发的服务没有完全符合REST风格规范,也可以使用

 

所以我们也不需要了解到底REST风格是什么样子的,可能你们有疑惑,这个也不了解那么我们怎么测试webapi呢

 

其实我们只要知道,不管系统处于那种设计风格,只要是基于HTTP协议,我们就能对他进行测试

只要是发送数据交互过程有来有往,我们就可以用通用的方法来测试这个系统

 

 

 

 

 

 

webAPI 测试特点

通常系统内部的接口是不需要QA测试的,如果测试需要提供API文档,因为这是一个判断api是否符合需求的标准。

即使要测试内部接口,多数也不是从功能的角度来测试,而是以安全的角度。

 

对外暴露的接口必须要对其进行测试,如果提供API文档,那么测试人员需要自己准备文档,然后提交给开发进行评审。

 

 

HTTP协议基础

http与html的关系

新学习web的人经常混淆的两个名词就是HTTP和HTML,

都是姓H的,都是互联网领域的名词。很容易混淆。

 

HTML是一种用来定义网页的文本语言,

会HTML,就可以编写网页;

我们访问百度得到的内容是html,大家可以打开浏览器查看源码看到HTML

 

HTTP是在网络上传输信息(当然也包括HTML)的协议,通常用于浏览器和服务器的通信。

 

两者的关系做个类比,一个好比快递的商品(HTML),一个好比运输商品的方式(http)

 

快递盒子既可以包装手机也可以包装其他商品,什么类型的信息都是不限制的

 

 

 

http请求

http请求消息包含如下内容

 

  1. 请求行(必须包含)

是http请求的第一行的内容,表示操作什么资源,通过什么http协议版本去获取

例如GET /images/logo.gif HTTP/1.1,

表示从/images目录下请求获取logo.gif这个文件。

再比如

POST / HTTP/1.1

表示向这个url地址 / 提交信息。

GET POST是请求的方法,我们后面会进一步讲解

 

  1. 请求头(必须包含)

例如Accept-Language: en

可以有好多个,比如

 

接下来http请求消息里面可能还有

  1. 空行(非必须)
  2. 消息体(非必须)

空行的主要目的是隔开消息头和消息体的

 

所以:

请求行和请求头是必须有的。

空行和消息体可能有也可能没有。

 

一个GET请求消息的例子如下

GET/index.htmlHTTP/1.1

Host: www.example.com

 

这个例子里面包括请求行和一个请求头,没有消息体。

 

 

一个POST请求消息的例子如下(注意请求头和消息体之间的空行)

 

POST / HTTP/1.1

Host: foo.com

Content-Type: application/x-www-form-urlencoded

Content-Length: 13

 

say=Hi&to=Mom

 

请求行

请求行在第一行,包含

  1. 请求的方法

请求的方法,表示请求的动作是获取信息、还是提交信息,还是修改信息、还是删除信息等。。

 

常见的有 GET,POST,PUT,DELETE

GET:

请求获取Request-URI所标识的资源

就是向uri指定的资源发出“获取”请求。使用GET方法一般用在读取数据,

这应该是一种最常见的请求了。

 

POST:

表示在Request-URI所标识的资源后附加新的数据

向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。

数据被包含在请求消息中。这个请求可能会创建新的资源或修改现有资源。

 

PUT:

向指定资源位置上传其最新内容。通常用于更新修改部分资源信息。

 

DELETE:

请求服务器删除Request-URI所标识的资源。

 

 

 

请求头字段 (request headers)

http的请求头用来表示请求的其它信息。

格式是:大小写不敏感的名字+冒号+空格+值

就像键值对,一个名字一个值,一个名字一个值

 

很多标准的请求头字段是由国际标准化组织制定的

https://tools.ietf.org/html/rfc4229

 

常见的请求头字段

Accept-Encoding:

例:

Accept-Encoding:gzip, deflate, br

表示客户端所支持的解码(解压缩)格式。

 

网路数据的传输都是占据带宽的,而将文件数据压缩能够降低数据量,减少传输时间。所以服务器在返回数据给客户端时,常常对数据进行压缩(对用户透明,通常由服务器或代理来做),而压缩的方式有多种,到底采用哪一种则需要看客户端支持哪种解码方式,这时候就可以根据header中Accept-Encoding的值。

 

文件或数据的压缩,由服务器或代理来做,一般不需要程序员干预;客户端接收到数据时解压缩,通常由浏览器自动完成,对用户透明。

对于我们主动发起的ajax请求,一般数据量较少,不需要设置该字段。

 

Accept-Language:

Accept-Language:zh-CN,zh;q=0.9

表示客户端支持的语言格式(不是编码格式),如中文/英文,通常浏览器直接发起请求时,浏览器会根据被设置的语言环境(默认语言),来附加上该字段。

 

一般我们服务器解析报文时,是不理会该字段的。

他的使用场景可以是这样的,假如有个文件,有各种语言的版本,这样当不同请求发来时,我们可以根据Accept-Language的值来判断到底返回哪种语言版本给客户端。

(其实这种应用场景也一般不采用判断Accept-Language字段的方法,不靠谱,还不如直接在url中体现语言版本呢)

 

Accept-Charset:

例:

Accept-Charset:gbk,utf-8;q=0.8

表示客户端支持编码格式。服务器在返回报文时,需要将字符按照一定的编码格式转换为字节序列发送给客户端,那么该采用哪种编码格式呢?

当然作为服务器端,他可以采用任何一种编码方式,客户端都得完完整整的接收响应报文。因为目前客户端几乎都支持常见编码类型,所以服务器在返回数据时,只需要按照既定的编码方式编码,然后在响应报文中告知客户端所使用的编码方式。这样客户端在接收到报文后按照该方式进行解码,就就不会出现乱码问题。

 

但是,如果客户端已经定了就使用某种解码方式,那么这时候服务器端就不能那么任性了,他就需要解析Accept-Charset字段,根据这个值,来设定采用的编码方式。

如上例中,以逗号分隔,客户端支持两种编码方式,gbk和utf-8(gbk优先级高于utf8),其中utf-8后的q值,表示utf-8占的“权重”。

---------------------

User-Agent:

例:

User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36

表示客户端的软件环境。如上可以看出使用的是Window10 64位操作系统,Chrome浏览器等信息。服务器可以根据该字段评估客户端的环境从而给出不同的响应。(比如根据请求是从手机端或是电脑端发起的,返回不同版本的页面)

 

Host:

例:

Host:localhost:8080

表示请求者的主机地址(IP地址)和端口号。

服务器端可以根据该字段进行ip过滤等操作。

 

Content-Type           

例子:

Content-Type :application/x-www-form-urlencoded

表示请求体的消息类型 (用于POST和PUT请求中)

常见的有x-www-form-urlencoded格式json格式还有xml格式

 

请求消息体

很多时候,http请求是需要请求消息体的,比如POST、PUT等请求。

Get通常是不需要消息体的。

 

post、put提交信息,会把消息内容翻到请求体里面。

 

请求消息体中保存了要提交给服务端的数据信息。

常见的消息体格式就三种,json,xml,www- form-urlencoded

其中最常见的就是json是后面课程的重点

 

json用来传递稍微复杂的数据

传递简单的用 www-form-urlencode

 

http响应

 

HTTP响应消息包含如下内容

 

  1. 状态行
  2. 响应头
  3. 空行
  4. 消息体

 

状态行和响应头是必须有的。

空行和消息体可能有也可能没有。

状态行

状态行在第一行,包含协议版本状态码和描述状态的短语

比如

HTTP/1.1 200OK

我们重点来看一下状态码,它表示客户端的的请求结果如何

  • 1xx消息——请求已被服务器接收,继续处理

(这类不常见,先忽略过去)

  • 2xx成功——请求已成功被服务器接收、理解、并处理

(最常见的就是200抓包给大家看看

  • 3xx重定向——需要后续操作才能完成这一请求

(在webapi中不常见)

就像店面移到新的地址,会贴一个告示,小王理发店已经移到。。

301 Moved Permanently永久性移动到新地址,再访问这个资源,就直接用新地址。比如小王理发店永久性移动到西街。。

如果下次访问,可以直接去西街

302 Moved Temporarily这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求

小王理发店,只是暂时的装修,临时移到西街,以后还会移回来,下次应该还是先去东街看看。

 

304 Not Modified

表示资源未被修改,因为请求头指定的版本If-Modified-SinceIf-None-Match。在这种情况下,由于客户端仍然具有以前下载的副本,因此不需要重新传输资源

现代的浏览器经常缓存资源数据,如果资源未被修改,通常不需要服务端传回全部的资源信息。节省效率和带宽。

其它的 30x不是特别常见,感兴趣的可以自己去学习。。

 

转发与重定向区别

https://www.cnblogs.com/ChrisMurphy/p/5059940.html

 

4xx请求错误——

这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。

400 Bad Request

401 Unauthorized未认证

403 Forbidden认证了,但是没有相应的权限

404 Not Found,访问http://ci.ytesting.com/portal/home33.html

常见错误,大家访问博客的时候,有时候遇到帖子被删了,或者文章的url发生了变化,用原来的地址访问就会出现这种情况

 

 

表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。

 

500 Internal Server Error服务端的代码错误导致,通常是一个异常抛出了

 

503 Service Unavailable

由于临时的服务器维护或者过载(比如被攻击导致服务端的防御措施),服务器当前无法处理请求。这个状况是暂时的,并且将在一段时间以后恢复。

 

 

 

响应头字段 (response headers)

http的响应头用来表示响应的其它信息。                                       

格式和请求头类似,有很多可以共用的字段。

Content-Type:text/html;charset=utf-8

消息体的数据格式,这个是经常使用的,

 

Content-Length表示请求消息体的长度

Date:Sun, 30 Jul 2017 08:25:37 GMT表示响应消息发送的日期时间

 

其他常用的响应头感兴趣的可以参考网上的信息,后面的课程会一一说到

 

 

响应消息体

很多时候,http响应是需要消息体的。比如请求一个网页的内容,那么我们网页的html内容就在响应的消息体中给出。

 

 

fiddler抓包工具

百度搜索 fiddler,https://www.telerik.com/fiddler

安装下载

 

随便填写

 

安装后打开,界面如下:

 

 

左边是抓到的http请求和响应,右边可以显示其具体信息。

 

 

fiddler抓包原理是作为代理监听了浏览器到web服务器之间的http通信请求

如图:

 

上面浏览器和服务器之间没有代理,抓不到包

下面浏览器和服务器之间加了代理,可以抓包

 

fiddler作为代理的 ip和端口是

tools-> options

 

动的时候,会修改系统代理设置,把自己设置为系统代理

 

如果我们要使用fiddler抓 web网站前后端的包,就要保证浏览器会使用 fiddler作为 proxy

有的浏览器比如火狐,不一定使用系统代理,可以手动设置浏览器代理为Fiddler的代理

抓个包看看。

 

这个inspector是查看内容

 

raw部分

 

如果这样,很多包都抓了,有些包不是我们关心的。

我们可以设置过滤条件,根据host过滤

 

locahost; httpbin.com

 

甚至根据url路径过滤

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

笔记1 - Web API 的概念和http协议 的相关文章

  • Kaldi-MFCC模块源码主流程分析

    那么趁着这个机会 研究一下kaldi源码中MFCC部分的内容 不说废话 我们从 compute mfcc feats cc开始讲解 这里是个main函数 需要携带参数 具体使用样例如下 1 compute mfcc feats 其实看到这里
  • JVM完整笔记

    这是我在看课程 黑马程序员JVM完整教程 过程中记的笔记 我觉得该课程总时不长 并且理论 实战是一个入门JVM的好课程 若你看完该课程可以看下面几个参看书进一步深入了解JVM 深入理解Java虚拟机 第二版 实战Java虚拟机 深入JAVA
  • Java基础3--Java流程控制语句

    Java基础3 Java流程控制语句 文章目录 Java基础3 Java流程控制语句 Java循环语句 while循环 do while循环 for循环 增强for循环 Java条件语句 if语句 if else语句 if多分支语句 Jav
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • Error Microsoft Visual C++ 14.0 is required 最佳解决方法,亲测有效

    这种pip安装不上的包 1 找whl包下载安装 去Python安装包大全中 https www lfd uci edu gohlke pythonlibs 去下载 对应后缀为 whl 的安装包进行安装 后缀为 whl 的安装包进行安装的方法
  • java永久区_Java方法区和永久代

    目前有三大Java虚拟机 HotSpot oracle JRockit IBM J9 JRockit是oracle发明的 用于其WebLogic服务器 IBM JVM是IBM发明的用于其Websphere服务器 因此在某行开发的时候 他们用
  • linux日志打到垃圾箱,shell输出的那个垃圾桶——/dev/null

    昨晚花费一整晚在知乎回答了一个关于shell里面的重定向输出到 dev null的问题 果断今晚也同步发在这里 反正也没人看 以下来自一个重度linux使用患者不请自来的回答 先用简单的语言回答题主的问题 shell程序中 2 gt dev
  • USB学习之一:USB协议基础

    USB开发者论坛http www usb org USB专区 http group ednchina com 93 1 1USB的特点 在USB1 0和USB1 1版本中 只支持1 5Mb s的低速 low speeed 模式 和12Mb
  • 探索健康养老的“最后一公里” 附下载地址

    目前中国机构养老市场参与者主要包括 房地产开发商 保险公司以及一些专业的养老服务企业 其中房地产开发商和保险公司凭借丰富的开发经验和充足的 资金流在市场上处于领先地位 目前市 场主流的机构养老项目的营利模式主要 分三类 即 非销售类 销售类
  • 《Stable Diffusion WebUI折腾实录》在Windows完成安装, 从社区下载热门模型,批量生成小姐姐图片

    环境 操作系统 Windows11 显卡 RTX2060 6GB 显存 安装Python 下载 Python3 10 6 https www python org ftp python 3 10 6 python 3 10 6 amd64
  • 马来西亚旅游不可不去的世外桃源

    全马最漂亮的8大冷门 世外桃源 美到您都不相信这些地方竟然在马来西亚 1 Pulau Besar 柔佛州 情侣来这旅游或蜜月 真的最适合不过了 想要找一个宁静 舒服 温暖的海边度假吗 那么PulauBesar 或许适合你 这里没有其他海边来
  • numpy.arrange函数知识大全

    numpy arrange函数知识大全 numpy arrange函数作用 numpy arrange函数作用 numpy arrange函数的作用是生成带起点和终点的特定步长的排列 根据函数的参数的个数分为以下几种情况 1 只有一个参数
  • 使用Android studio 查看其它app的布局的结构

    日常开发过程中 难免会遇到一些比较好看的布局 这时候我们就想学习一下别人的布局结构 以便参考 如果是前端开发的话 直接用Chrome可以查看别人布局的结构 如果是android的就比较麻烦一些 不过也是可以的 只需要简单的两步 下面来演示一
  • 逻辑判断

    一 论证推理 1 1 基本原理 论证的基本原理 话题一致 例如 甲论证 中国足球不行 这个论点时 乙说 你行你上 这就是典型的话题不一致 因为 我足球行不行 和 国足行不行 是没有关系的 1 2 解题步骤 所有的论据都是为论点服务的 1 明
  • vs+qt添加qtOpengl时,要小写

    奇怪了 一开始添加模块时 写成了Opengl 是qmake错误 改成opengl就可以了
  • 一个简单的测试案例

    题目 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计 其规格说明如下 若投入5角钱或1元钱的硬币 押下 橙汁 或 啤酒 的按钮 则相应的饮料就送出来 若售货机没有零钱找 则一个显示 零钱找完 的红灯亮 这时在投入1元硬币并押下按
  • Python · 无限画板(零)· 简介

    项目 GitHub 地址 免费线上示例产品 该示例产品的源代码 封面图对应的项目的源代码 需求 方案 在上一篇文章 用 Python 打造 AIGC 的 操作系统 里 我提到过这个 Python 无限画板的项目 carefree drawb
  • Pytorch CAM特征可视化

    背景 类别激活映射 Class Activation Mapping CAM 用于对深度学习特征可视化 通过特征响应定位图像的关键部位 为深度学习可解释性提供了一种方法 ACM以热力图的方式展示了图像局部响应的强弱信息 对应于更强的位置具有
  • 无线打印机服务器安全吗,注意安全 彻底拒绝打印机被非法共享

    为了提高打印机的利用率 不少单位往往会通过局域网对打印机进行共享使用 不过这样一来 局域网内的非法用户也有可能趁机使用共享打印机 从而造成打印成本的 节节攀升 为了阻止非法用户对打印机随意进行共享 本文特意总结了以下几则 拒绝 妙招 相信这

随机推荐

  • 2021 Android面经及求职总结

    投递情况 主要投递了国内和国外的互联网公司 同时也投递了一些币圈企业 最终斩获battmd offer和一币圈的百万年薪offer 关于如何准备面试 可以关注我的面试准备系列文章如何准备一场技术面试 offer斩获情况 大大小小共12家公司
  • K8S学习之Statefulset

    Statefulset概念 应用场景包括 1 稳定的持久化存储 即Pod重新调度后还是能访问到相同的持久化数据 基于PVC来实现 2 稳定的网络标志 即Pod重新调度后其PodName和HostName不变 基于Headless Servi
  • MySQL 异步复制源自动故障转移

    1 异步复制源架构 1 1基于主从复制的异步复制源 从MySQL 8 0 22开始支持异步连接故障转移机制 我们可以在一套主从复制架构的基础上 创建一个异步复制连接的Replica副本 当主从复制Source发生意外宕机 业务提升Repli
  • Nethereum:.NET应用和以太坊智能合约的桥梁

    Nethereum基本上是目前唯一可用的 NET平台下的web3 js移植包 在这个教程中 我们将首先编写并部署一个简单的智能合约 然后创建一个简单的 NET应用 并使用Nethereum来访问以太坊上的智能合约 Nethereum是通过以
  • vim编辑文件出错: Another program may be editing the same file.An edit session for this file crashed.

    以下是错误详细代码 E325 ATTENTION Found a swap file by the name schema xml swp owned by root dated Thu May 28 21 19 42 2020 file
  • mvcc匹配规则

    1 当前快照读读出的事务id
  • Oracle<-->MySQL

    to char 123 456 FM9 990 09 format 123 456 2 default en US 9 999 999 to char 123 cast 123 as unsigned int unsigned signed
  • 软件测试工具比较

    软件测试工具比较 作者 乔元 来源 无忧软件测试网 http www csai cn 2005年11月18日 随着软件测试的地位逐步提高 测试的重要性逐步显现 测试工具的应用已经成为了普遍的趋势 目前用于测试的工具已经比较多了 这些测试工具
  • 在Ubuntu16.04上安装QQ

    在Ubuntu16 04上安装QQ 霾大 1 个月前 最近装了双系统win10 ubuntu16 04 想在ubuntu上装个QQ 然后发现 在网上找了不少教程 都是装的wine qq 装了才发现显示版本过低 登不上去啊 后来发现用cros
  • MySQL数据库(二)SQL语言和数据类型

    成功不易 加倍努力 1 SQL语言 1 1 关系型数据库的常见组件 1 2 SQL语言的兴起与语法标准 2 管理数据库 2 1 创建数据库 2 2 修改数据库 2 3 删除数据库 2 4 查看数据库列表 3 数据类型 3 1 整数型 3 2
  • linux定时调用存储过程,linux下crontab定时执行shell脚本调用oracle 存储过程

    问题 脚本内调用存储过程 脚本直接执行没问题 使用crontab 执行脚本存储过程未执行 原因 缺少oracle环境变量 解决 在shell脚本里添加oracle的环境变量 bin sh PATH PATH HOME bin 环境变量 ex
  • 获取层级(结构树)

    public ResponseDTO
  • 使用typescript去简单的写一个时间显示的canvas小球

    在学习完了ts后 一直想找一个项目练手 可网上开源的项目 写的ts项目 还是有点复杂 不太适合刚刚学完ts想练手的同学 于是就打算自己写一个 ts小项目 大概需求就是 1 可以根据当前时间 用canvas绘制一个时间 2 可以每隔一秒 收集
  • ld 链接程序出错定位

    工具链相关问题 一般可 verbose 下 看看具体什么地方出问题 设置 LDFLAGS Wl verbose 例如 链接一堆 o文件 只有以下错误信息 ld final link failed Bad value 就可以加入 Wl ver
  • python3 中的import 和from import 使用区别(包和模块)

    python3 中的import 和from import 使用区别 包和模块 1 知识点 1 什么是包 什么是模块 2 import from import 如何使用 3 import 和 from import 使用区别 2 实现 以如
  • 【Flink】第一节 源码编译

    我认识以及改造flink的第一步从下载编译源码开始 0 环境 idea java 1 8 scala 2 12 flink 1 16 maven setting 核心 nodejs 这个去官网下载安装一下就好 npm v 显示成功就好 文末
  • 百度编程大赛试题----类似九格宫(C++算法实现)

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 在网上有讲到 lt lt 度编程大赛试题 类似九格宫的C 试题 gt gt 的文章 http hi baidu com tw
  • 基于Vue实现的用户可注册登录的Todo-List清单

    用到技术 Vue 脚手架 路由 element UI 文件目录 src components Enter vue MyBanner vue MyFooter vue MyHeader vue MyItem vue MyList vue pa
  • 定义一个表示学生信息的类Student...

    定义一个表示学生信息的类Student 要求如下 1 类Student的成员变量 nO 表示学号 name表示姓名 sex表示性别 age表示年龄 java 表示Java课程成绩 2 类Student带参数的构造方法 在构造方法中通过参数完
  • 笔记1 - Web API 的概念和http协议

    接口定义 接口是个比较泛义上的概念 主要表示系统对外交互的部分 比如电源插座是电器和电能之间的接口 图形界面是应用软件和用户的接口 医院挂号大厅是医生和病人之间的接口 webAPI 我们要学习的接口概念缩小到web系统提供的对外消息交互接口