遇一山,过一山,处处有风景;只要勇敢向前,一路尽是繁花盛开。 | (点击查看→)【测试干货】python/java自动化、持续集成、性能、测开、简历、笔试面试等

http协议

 

简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW : World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。

HTTP是应用层的协议之一,它是一种简单、灵活的通信协议,客户端(浏览器)通过URL地址基于http协议访问服务器,服务器收到请求后基于http协议将响应的内容返回给客户端。

 

http协议特性

(1) 基于TCP/IP协议

HTTP协议是基于TCP/IP协议之上的应用层协议。

HTTP是通过 Socket 来使用 TCP 的,Socket 做为套接层 API,它本身不是协议,只规定了 API。


(2) 基于请求(request)-响应(response)模式

HTTP协议规定,请求从客户端发出,最后服务器端处理请求并返回,就是说,有请求,就要有应答。另外,服务端在接收到请求之后才会发送响应。


(3) 无状态保存

HTTP是一种不保存状态,即无状态(stateless)协议。

HTTP协议自身不对请求和响应之间的通信状态进行保存。协议本身并不保留之前每次的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成 如此简单的。

为了弥补这个缺陷,后续引进了cookie、session、token等相关技术手段(业务相关)。

(4) 短连接

HTTP1.0默认使用的是短连接(有的资料也说是无连接的协议)。浏览器和服务器每进行一次HTTP通信,就建立一次tcp连接,通信结束就断开tcp连接;

HTTP/1.1起,默认使用长连接。要使用长连接,客户端和服务器的HTTP首部的Connection都要设置为keep-alive才能支持长连接。HTTP长连接,指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接(一个http请求在完成时,标注是keep-alive的,底层的tcp连接不需要断开,可以供多个http连接使用),这就节省了TCP连接建立和断开的消耗;

HTTP/2.0,多路复用。

 

http请求协议与响应协议

http协议包含(两个部分):

  http request:由浏览器发送数据到服务器需要遵循的请求协议,http请求包含三个部分:request line、 request header、 request body;已经由浏览器或者其它客户端工具帮我们封装好了

  http response:服务器发送数据到浏览器需要遵循的请求协议,http响应包含三个部分:response line、 response header、 response body。

 

演示代码

server.py

import socket

# 创建TCP Socket对象;括号中的实参是默认值,可以简写为:sock = socket.socket()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
host = '127.0.0.1'
port = 8089
sock.bind((host, port))

# 开始监听连接
sock.listen(5)
print('等待客户端连接...')

while True:
    # 接受客户端连接并返回新的Socket对象
    conn, addr = sock.accept()  # 阻塞等待客户端连接

    # print('与客户端', addr[0], '建立了连接!')

    # 接收客户端发送的请求数据,接收最多4096字节大小的请求数据,然后将其转换成UTF-8编码格式的字符串
    data = conn.recv(4096)
    # data = conn.recv(4096).decode("utf-8")
    print('接收到的请求数据为:', data)

    # 服务端返回数据
    conn.send('HTTP/1.1 200 ok\r\nserver:qzcsbj\r\ncontent-type:application/json\r\n\r\n{"code":0,"message":"success","data":{"id":"1","name":"韧"}}'.encode("utf-8"))

    print('返回数据给客户端完成')

    # 关闭当前客户端连接
    conn.close()

 

HTTP请求协议

用jmeter发送请求

 

server端打印内容

 

接收到的请求信息decode后打印

 

HTTP请求协议:request line、 request header、 request body

请求首行请求头请求体

POST /v2/user/findByName?name=ren HTTP/1.1
Connection: keep-alive
Content-Type: application/json
Content-Length: 4
Host: 127.0.0.1:8089
User-Agent: Apache-HttpClient/4.5.7 (Java/1.8.0_211)
空行
id=1

 

 

HTTP响应协议

用浏览器发送请求

 

 

 

HTTP响应协议:response line、 response header、 response body

响应首行响应头响应体

HTTP/1.1 200 ok
server:qzcsbj
content-type:application/json
空行
{"code":0,"message":"success","data":{"id":"1","name":"韧"}

 

 

另外,下面是浏览器给我们封装的请求协议:

\r\n\r\n表示空行,后面内容,因为get请求没有请求体,参数在路径后面

decode后打印结果

 

补充:response code

  响应代码,又叫状态码。是服务器用来告知客户端,对于请求的处理状态的。响应代码通常是三位长度的数字,一般来说根据首位字母进行的大致分类。

  1xx:通常表示通信连接过程中的交互信息

  2xx:典型的就是200,表示处理成功;200只是表示http协议层面的成功,不一定表示业务成功

  3xx:通常表示重定向

  4xx:客户端错误。400 就是客户端发送的数据有误;403 客户端的权限问题;404 资源未找到。

  5xx:服务器错误

 

其它参考:

1xx(临时响应),并需要请求者继续执行操作的状态代码
100:客户端应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101:(切换协议) 客户端要求服务器切换协议,服务器已确认并准备进行切换。
102:由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。


2xx(成功),处理了请求的状态代码
200:正确的请求返回正确的结果,如果不想细分正确的请求结果都可以直接返回200。
201:表示资源被正确的创建。比如说,我们 POST 用户名、密码正确创建了一个用户就可以返回 201。
202:请求是正确的,但是结果正在处理中,这时候客户端可以通过轮询等机制继续请求。
203:请求的代理服务器修改了源服务器返回的 200 中的内容,我们通过代理服务器向服务器 A 请求用户信息,服务器 A 正常响应,但代理服务器命中了缓存并返回了自己的缓存内容,这时候它返回 203 告诉我们这部分信息不一定是最新的,我们可以自行判断并处理。
204:服务器成功处理了请求,但是不需要返回任何实体内容。如果客户端为浏览器,则浏览器不发生跳转,停留当前页面,但是页面中的文档信息更新。
205:服务器成功处理了请求,且没有返回任何内容,与204不同点为,文档信息清空。
206:服务器已成功处理了部分get请求。请求里必须包含Range头信息来只是客户端希望得到的内容范围,并且可能包含if-Range来作为请求条件。
207:由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。


3xx(已重定向),表示要完成请求,需要进一步操作
300:请求成功,但结果有多种选择。
301:请求成功,但是资源被永久转移。比如说,我们下载的东西不在这个地址需要去到新的地址。
302:在其他地址发现了请求数据。
303:使用 GET 来访问新的地址来获取资源。
304:请求的资源并没有被修改过。
305:请求的资源必须从服务器指定的地址得到。
306:在最新的规范中,306状态码已不被使用。
307:请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
308:使用原有的地址请求方式来通过新地址获取资源。


4xx(请求错误)
400(错误请求)表示客户端请求的语法错误,服务器无法理解,例如 url 含有非法字符、json 格式有问题。
401(未授权)请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
402表示保留,将来使用。
403(禁止)表示服务器理解请求客户端的请求,但是拒绝请求。
404(未找到)服务器无法根据客户端的请求找到资源(网页)。
405(方法禁用)禁用请求中指定的方法。
406(不接受)无法使用请求的内容特性响应请求的网页。
407(需要代理授权)此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408(请求超时)服务器等候请求时发生超时。
409(冲突)服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。
410(已删除)如果请求的资源已永久删除,服务器就会返回此响应。
411(需要有效长度)服务器不接受不含有效内容长度标头字段的请求。
412(未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件。
413(请求实体过大)表示响应实在太大。服务器拒绝处理当前请求,请求超过服务器所能处理和允许的最大值。
414(请求的 URI 过长)请求的 URI(通常为网址)过长,服务器无法处理。
415(不支持的媒体类型)请求的格式不受请求页面的支持。
416(请求范围不符合要求)如果页面无法提供请求的范围,则服务器会返回此状态代码。
417(未满足期望值)在请求头 Expect 指定的预期内容无法被服务器满足(力不从心)。
418表示我是一个茶壶。超文本咖啡馆控制协议,但是并没有被实际的 HTTP 服务器实现。
420表示方法失效
422表示不可处理的实体。请求格式正确,但是由于含有语义错误,无法响应。


5xx(服务器错误)
500(服务器内部错误)服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
501(尚未实施)服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应。
503(服务不可用)服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505(HTTP 版本不受支持)服务器不支持请求中所用的 HTTP 版本。

 

补充:URL的构成

URL包含:协议、域名、端口、path(URI)、URL地址参数

URL(uniform resource locator,统一资源定位器)是URI的一种实现,URI是URL的一部分

URI(uniform resource identifier,统一资源标识符)是抽象概念

 

比如:http://www.qzcsbj.com:8089/v2/user/findByName?name=ren

协议是:http

域名是:www.qzcsbj.com,域名解析为ip,通过ip找到接入到网络中的硬件服务器

端口是:8089,通过端口号找到运行在硬件服务器中的软件服务

路径是:/v2/user/findByName

参数是:name=ren

 

posted @ 2024-02-16 09:45  全栈测试笔记  阅读(24)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end