1.用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。
HTTP报文大致可以分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
2.请求报文
HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
请求报文的格式如下:
一个GET请求报文如下:
GET /hello/index.jsp HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98
一个POST请求报文如下:
POST /hello/index.jsp HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://localhost:8080/hello/index.jsp
Accept-Language: zh-cn,en-US;q=0.5
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 13
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=E365D980343B9307023A1D271CC48E7D
keyword=hello
相关参数解释如下:
请求首行:第一行数据
GET /hello/index?num=8 HTTP/1.1。表示请求方法、请求的资源(URL)地址、请求的协议和版本。案例中的含义就是:GET请求,请求服务器路径为/hello/index,请求协议和版本号为http1.1。同时GET请求的URL后面还附带了请求的参数num=8。
请求头:key-value的形式,value也可以使用key-value传递多个数据,使用“;”分隔:
Host:localhost。表示接受请求的服务器地址(请求的主机地址),可以是IP:端口号,也可以是域名。案例中的含义就是:localhost,即本机。
Connection: keep-alive。指定的连接相关的属性。案例中的含义就是:保持一段时间连接,默认就为3000ms;
Accept: application/json, text/plain, /。告诉服务器当前客户端可以接收的文档类型,其实这里包含了*/,就表示什么都可以接收;
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36。与浏览器和OS相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的;
Referer: https://www.baidu.com/。请求来自哪个页面,例如你在百度上点击链接到了这里,那么Referer:http://www.baidu.com;如果你是在浏览器的地址栏中直接输入的地址,那么就没有Referer这个请求头了;
Accept-Encoding: gzip, deflate, br。支持的压缩格式。数据在网络上传递时,可能服务器会把数据压缩后再发送;
Accept-Language: zh-CN,zh;q=0.9。当前客户端支持的语言,可以在浏览器的工具-选项中找到语言相关信息;
Accept-Charset: GB2312,utf-8;q=0.7,;q=0.7。客户端支持的编码;
Cookie: PSTM=1594605101;JSESSIONID=369766FDF622xx。用于在客户端缓存一些信息,通常用于服务器的会话功能(session)的客户端实现。比如存储用户登录信息,实现跳转免登录,后面会专门讲解。
Content-Type: application/json;charset=UTF-8。请求和响应中的媒体类型信息(数据类型)。用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等。这里的application/json;charset=UTF-8表示JSON格式的数据交互,这是前后端分离开发的常用数据格式。
Content-Length:13。请求体的长度,这里表示13个字节。
请求空行(CR+LF):用来分隔请求头和请求体的数据。
请求体:POST请求是可以有体的,就是POST请求提交的数据,而GET请求不能有请求体,它的请求的数据会附在url之后。
3.GET和POST提交的区别
4 响应报文
接收到请求的服务器,会将请求内容的处理结果以响应的形式返回。响应报文格式如下:
响应首行和响应头共同构成了HTTP响应首部!
响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示。
响应首行:
HTTP/1.1 200 OK。包括了响应协议、状态码、以及解释。该案例表示响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释;
响应头信息:
Server: Apache-Coyote/1.1。服务器的版本信息;
Content-Type: text/html;charset=UTF-8。将会响应html文本类型的数据,响应体使用的编码为UTF-8;前后端分离开发时常用的就是application/json。
Content-Length: 724。响应体为724字节;
Set-Cookie: JSESSIONID=C97E2B4C55xx; Path=/hello。响应给客户端的Cookie;
Date: Wed, 25 Sep 2012 04:15:03 GMT。响应的时间,这可能会有8小时的时区差;
响应空行:区分响应头和响应体
响应体:返回给客户端(浏览器)的数据,下面的案例中返回的是一个HTML页面,从Content-Type: text/html;charset=UTF-8中能确定响应类型。
以下是一个常见的响应报文,响应内容为一个HTML页面:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 724
Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello
Date: Wed, 25 Sep 2012 04:15:03 GMT
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="http://localhost:8080/hello/">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="" method="post">
关键字:<input type="text" name="keyword"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
5.响应状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码(HTTP Status Code)的信息头(server header)用以响应浏览器的请求。
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
6.常见响应码
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,响应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上。
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙
7.TCP模拟HTTP发送GET和POST请求,采用模拟工具TCP网络调试助手
客户端TCP连接IP后发送GET请求
GET http://81.68.106.231:7800/gt/SignIn.php?A=2321008V3610&B=&C=0;0;0;0;0;0&D=测试机构&E=测试用户&F=8&Z=Y HTTP/1.0
Host:181.68.106.232:7820
第一行 GET请求方式+空格+路径+空格+HTTP/1.0 (参数可以加到路径上)
第二行到第三行 请求头,自行百度可以根据需要加行( Host必须要有,这样能再服务器上找到要哪个域下的文件)
第四行 空行(必须含有)
第五行 空行(必须含有)
服务器响应GET请求
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 21
Server: Werkzeug/2.0.2 Python/3.6.8
Date: Tue, 31 Oct 2023 02:17:23 GMT
<>OK=20231031101723\r\n
客户端TCP连接IP后发送POST请求
POST http://181.68.106.232:7820/Up/BH101Gs/UploadAssays HTTP/1.0
Host:181.68.106.232:7820
Content-Length:671
Content-Type:application/x-www-form-urlencoded;charset=UTF-8
scannerCode=&deviceId=2321008V3610&assayTagId=2321008V3610231011153249&assayDate=2023-10-11 15:32:49&cardId=123456&itemSampleType=&operator=ABC&agency=1501&lbs=0;0;0;0;0;0;&location=Test address&coordinate=0.000000,0.000000&detectedName=Name of test&detectedId=100000000000000000&total=3&result=[{"tag":1,"assayValue":"0.000000","calValue":"44.455681","unit":"n","itemName":"KET","conclusion":"阳性","sampleTypeName":""},{"tag":2,"assayValue":"0.000000","calValue":"54.455479","unit":"n","itemName":"MOP","conclusion":"阳性","sampleTypeName":""},{"tag":3,"assayValue":"0.000000","calValue":"30.500000","unit":"n","itemName":"MET","conclusion":"阳性","sampleTypeName":""}]
注意:请求体后面的数据必须有两个\r\n\r\n
服务器响应客户端
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 6
Server: Werkzeug/2.0.2 Python/3.6.8
Date: Mon, 30 Oct 2023 10:40:22 GMT
<>==OK
HTTP相关参考网址:
https://api.dandelioncloud.cn/article/details/1610084821210710018