HTTP 有两类报文


请求报文——从客户向服务器发送请求报文。(发送哪些请求,如GET获取网页内容。账户名,密码提交给服务器,需要POST)

响应报文——从服务器到客户的回答。(服务器收到请求给客户端一个状态,请求成功或者失败,有没有权限访问)

由于 HTTP 是面向正文的 (text-oriented),因此在报文中的每一个字段都是一些 ASCII 码串,因而每个字段的长度都是不确定的。(明文的,不加密)

HTTP 的报文结构(请求报文)


http报文有两种,一种是请求报文(从请求端发出的),另外一种叫响应报文(从服务器发出的),而里面的信息就是HTTP协议交互的信息。

HTTP 请求报文


HTTP 请求报文由 3 大部分组成:

  • 请求行(必须在 HTTP 请求报文的第一行)

  • 请求头(从第二行开始,到第一个空行结束。请求头和请求体之间存在一个空行)

  • 请求体(通常以键值对 {key:value}方式传递数据)

报文分为三个部分,请求行,请求头,请求体,需要说明一点,请求体是可以忽略的。

比如请求方法header方法,它就不会去获取请求体,而对于请求头来说,它是由多行数据构成的字符串文本,数据都是通过换行符隔开。

请求行开头的 POST 表示请求访问服务器的类型,称为方法(method),随后的字符串 /form/login 指明了请求访问的资源对象,也叫做请求 URI(request-URI)。

最后的 HTTP/1.1 即 HTTP 的版本号,用来提示客户端使用的 HTTP 协议功能。

综上来看,这段请求的意思就是:请求访问某台 HTTP 服务器上的 /form/login 页面资源,并附带参数 name = veal、age = 37。

注意,无论是 HTTP 请求报文还是 HTTP 响应报文,请求头/响应头和请求体/响应体之间都会有一个“空行”,且请求体/响应体并不是必须的。

curl 'https://www.baidu.com/?name=lulei&age=29' \-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \-H 'Accept-Language: zh-CN,zh;q=0.9' \-H 'Connection: keep-alive' \-H 'Cookie: BIDUPSID=616742439A1B008BD27A12AAF298A29D; PSTM=1650946218; BAIDUID=616742439A1B008BF808E3254C13E17E:FG=1; BDUSS=klxQ3kxdi1jSk1OckJ3eVN3NnBqSjZRZzNGdGJzYTg3a3NMU0w5V1pTd0k5YXBpSVFBQUFBJCQAAAAAAAAAAAEAAAA73A1HY29tcGxpY2F0ZeKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhog2IIaINiY; BDUSS_BFESS=klxQ3kxdi1jSk1OckJ3eVN3NnBqSjZRZzNGdGJzYTg3a3NMU0w5V1pTd0k5YXBpSVFBQUFBJCQAAAAAAAAAAAEAAAA73A1HY29tcGxpY2F0ZeKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhog2IIaINiY; BAIDUID_BFESS=616742439A1B008BF808E3254C13E17E:FG=1; BD_UPN=12314753; B64_BOT=1; ZFY=MOsBXemfFniuaZLTJ3073pkaKW75MEjp6dEzxJns6js:C; BD_HOME=1; BA_HECTOR=21840l8h85050gah8h20au1e1hm65iu1b; BDRCVFR[mkUqnUt8juD]=mk3SLVN4HKm; delPer=0; BD_CK_SAM=1; PSINO=3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; baikeVisitId=2eb7d275-e969-431d-92cb-c479fe62ae2a; COOKIE_SESSION=13_1_5_6_3_5_0_0_5_2_2_1_39_0_0_0_1667353664_1666775331_1667454485%7C9%230_1_1666775322%7C1; H_PS_PSSID=; sugstore=0' \-H 'Sec-Fetch-Dest: document' \-H 'Sec-Fetch-Mode: navigate' \-H 'Sec-Fetch-Site: none' \-H 'Sec-Fetch-User: ?1' \-H 'Upgrade-Insecure-Requests: 1' \-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' \-H 'sec-ch-ua: "Chromium";v="106", "Google Chrome";v="106", "Not;A=Brand";v="99"' \-H 'sec-ch-ua-mobile: ?0' \-H 'sec-ch-ua-platform: "Windows"' \--compressed

请求行(一)


request-line = method       request-target        HTTP-version CRLF

 请求行定义是Request line,方法+request target+HTTP版本

如同所示GET就是一个方法,中间request target就是这个的path,最后是版本号。

method 方法:指明操作目的,动词
• request-target = origin-form / absolute-form / authority-form / asterisk-form

请求行(二)


request-target = origin-form / absolute-form / authority-form / asterisk-form

origin-form = absolute-path [ "?" query ]
         • 向 origin server 发起的请求,path 为空时必须传递 /

request-target有四种格式,最常用的格式是origin-form,它是向源服务器,产生响应内容的服务器发起请求的。

absolute-form = absolute-URI
         • 仅用于向正向代理 proxy 发起请求时,详见正向代理与隧道

在浏览器当中配置了正向代理proxy之后,这个时候使用的request target就采用了absolute-form,就是后面会跟着完整的url。

authority-form = authority
         • 仅用于 CONNECT 方法,例如 CONNECT www.example.com:80 HTTP/1.1

connect方法,将建立VPN等隧道的时候才会使用到CONNECT www.example.com:80 HTTP/1.1

asterisk-form = "*“
         • 仅用于 OPTIONS 方法

请求行(三)


HTTP-version 版本号发展历史:https://www.w3.org/Protocols/History.html

• HTTP/0.9:只支持 GET 方法,过时
• HTTP/ 1.0:RFC1945,1996, 常见使用于代理服务器(例如 Nginx 默认配置,nginx在向上游发起连接的时候,默认还是在使用1.0的协议)
• HTTP/ 1.1:RFC2616,1999(对1.0做了改进,支持缓存,支持长连接,对于域名的支持通过host头部)
• HTTP/ 2.0:2015.5 正式发布

常见方法(RFC7231)


• GET:主要的获取信息方法,大量的性能优化都针对该方法,幂等方法(调用一次和调用多次获得的结果是完全一致的)

• HEAD:类似 GET 方法,但服务器不发送响应BODY,用以获取响应HEAD 元数据,幂等方法
• POST:常用于提交 HTML FORM 表单、新增资源等(它不是1幂等的,提交多次,所得到的结果是完全不同的)
• PUT:更新资源,带条件时是幂等方法
• DELETE:删除资源,幂等方法
• CONNECT:建立 tunnel 隧道
• OPTIONS:显示服务器对访问资源支持的方法,幂等方法
• TRACE:回显服务器收到的请求,用于定位问题。有安全风险
Changes with nginx 0.5.17 02 Apr 2007 *) Change: now nginx always returns the 405 status for the TRACE method

所以在2007年的时候nginx在0.5版本对trace方法不再支持了,每次发送trace方法都返回405错误码。

-I来查看options方法一个响应的头部。可以看到返回allow头部,新资源支持哪些方法的访问。

应用层 HTTP 请求行相关推荐

  1. java http head 请求_http请求头header、请求体body、请求行介绍

    HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问 服务器的时候,http请求头的所有信息都封装在这个对象中,通过这个对象,可以获取客户端请求的所有信息.htt ...

  2. Request —— 获取请求行数据 获取请求头数据 获取请求体数据

    1. request对象和response对象的原理     1. request和response对象是由服务器创建的.我们来使用它们     2. request对象是来获取请求消息,respon ...

  3. Http的请求协议请求行介绍

    请求协议包含的内容 请求行 GET /day04-tomcat/index.jsp HTTP/1.1 HTTP/1.1: 表示的是我们使用的是http协议的1.1版本 请求头 请求空行 请求体: 存储 ...

  4. 获取Http协议的请求行,请求头

    效果如下图: 源代码如下: package star.july;import java.io.IOException; import java.io.PrintWriter; import java. ...

  5. request获得请求行的内容

    通过抓包工具抓取Http请求 因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请求头和请求体 通过request获得请求行 获得客户端的请求方式:String getM ...

  6. Request_获取请求行数据_方法介绍

    request功能:     1. 获取请求消息数据         1. 获取请求行数据             * GET /day14/demo1?name=zhangsan HTTP/1.1 ...

  7. HTTP_请求消息_请求行

    * 请求消息数据格式     1. 请求行         请求方式 请求url 请求协议/版本         GET /login.html    HTTP/1.1 * 请求方式:        ...

  8. Nginx HTTP之请求行解析函数ngx_http_parse_request_line

    Nginx的HTTP模块中使用ngx_http_parse_request_line函数来对读取的请求行进行解析,HTTP请求行的格式不是很复杂,但是要注意HTTP 0.9与1.0.1.1之间的区别: ...

  9. 通俗易懂。HTTP请求行、请求头、请求体、响应行、响应头、响应体详解

    一. HTTP请求报文解剖 HTTP Request :HTTP请求 Request Line:请求行 Header:请求头 Request Body:请求体 HTTP请求报文由3部分组成(请求行+请 ...

最新文章

  1. android数据库降级_Android SQLite (二.数据库创建,升级及降级)
  2. 多媒体视像会议中音视频矩阵的用途
  3. 实现一个简单的编译器
  4. .NET防SQL注入方法
  5. Module(模块)
  6. 协调多个对象之间的交互——中介者模式
  7. 16x16x16 4096个RGB LED的光立方是一种怎样的神奇效果?视频展示制作全过程
  8. 仿某某网站模板thinkphp_西安网站建设到底是什么?
  9. 学校老师绝对不会教的方法,让你的孩子拥有一个开挂般的人生!
  10. Linux Vi 的使用
  11. 如何获取Android移动终端设备唯一ID
  12. html自动计算时间代码,原生JavaScript实现日期计算器功能
  13. 计算机课怎么管纪律,作为班主任,班级纪律应该怎么管?丨班级圆桌派
  14. android2.2 模拟器,网易MuMu模拟器2.2.29官方版
  15. 苏建林DGCNN模型代码详解
  16. 【HGNN】北邮循序渐进研究HGNN
  17. 简单解决虚拟机无法连接外网
  18. 《白帽子讲web安全》学习笔记(第一篇)
  19. 面试必备:《Java 最常见 200+ 面试题全面解析》
  20. C/C++语言常用开发工具

热门文章

  1. 好用的企业直播平台有哪些
  2. 算法第二期——排列组合(Python)
  3. Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性...
  4. PTA-7-32 说反话-加强版(C语言)
  5. Linux内存管理子系统——mmap内存映射原理分析(dax文件系统的mmap)
  6. (转)WebService是什么
  7. 一加7发布把雷军送上热搜,为何没人担心华为P30?
  8. 如何解决 img 标签四周出现白边的问题
  9. PBR工作流实现与对比
  10. 2021重庆市高考成绩排名查询,2021年重庆各高中高考成绩排名及放榜最新消息