4.1.2.HTTP报文格式解析

2023-05-16

不同的请求方式,他们的请求格式可能是不一样的,请求格式就是我们所说的的报文格式。但是,通常来说一个HTTP请求报文由请求行(request line)、请求头(header)、空行和请求数据4个部分组成,如图给出了请求报文的一般格式:
HTTP报文格式

1.起始行
报文的第一行就是起始行,在请求报文中用来说明要以什么方式做什么请求,而在响应报文中粗略说明了报文的执行结果。

2.首部字段
起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(如:Connection: keep-Alive)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。

3.主体
首部字段的空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据;响应主体中转载了要返回给客户端的数据。起始行和首部都是结构化的文本形式,而主体则可以包含任意的二进制数据(如图片、视频、音轨、软件程序)。当然,主体也可以包含文本。

在浏览器中输入http://www.devtf.cn/?p=909:
得到的请求报文如下:
GET /?p=909 HTTP/1.1
Host: www.devtf.cn
Cache-Control: no-cache
根据上述的HTTP请求格式可知,第一行为请求行,代表请求方式是GET,子路径为/?p=909,表示参数为909,HTTP版本为1.1。后两行是请求的HEADER区域,第一个请求头是主机地址,值www.devtf.cn。另外一个Cache-Control,值为no-cache。GET、DELETE请求的所有参数都附加在URL链接中,因此,请求数据部分为空。

对于PUT和POST来说,报文格式一般都是表单形式,也就是说这两个请求方式的参数存储在报文的请求数据(报文主体)的位置上:

POST /api/feed HTTP/1.1
Accept-Encoding: gzip
Content-Length: 225873
Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Host: www.myhost.com
Connection: Keep-Alive

--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Content-Disposition: form-data; name="username"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Mr.Simple
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Content-Disposition: form-data; name="images";
filename="/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

这里是图片的二进制数据,数据太长,在次省略
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--

上述请求的含义为向www.myhost.com/api/feed/这个地址发送一个POST请求。这个请求的数据格式(Content-Type)multipart/form-data,报文的boundary值为OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp。该报文有两个参数,一个参数是文本类型的username参数,值为Mr.Simple,另一个是名为images的二进制参数,数据是一张图片的二进制数据,这里我们将图片的二进制数据省略了。
需要注意的是,一个参数是以两个横杠加上boundary开始的,然后是该参数的一些属性信息,例如参数名、格式等,然后加上一个空行,最后才是参数的值。例如上述username参数的完整格式为:

--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp                // 两个横杠加上boundary值
Content-Disposition: form-data; name="username"   // 这3个是请求参数的Header属性
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
                                                 // 这里是一个不可省略的空行
Mr.Simple                                        // 这是参数值

POST和PUT都必须遵循这种的格式,每个参数以两个横杠和boundary分隔,参数header与参数值之间有一个空行。另一个要注意的地方是,请求数据的最后是两个横杠+boundary值+两个横杠作为整个报文的结束符。当手动构建POST请求报文时,这些格式就尤为重要,如果格式不正确,那么服务器将无法正确解析你的请求。

4.1.2.1.响应报文

HTTP响应也由3个部分组成,分别是:状态行、消息报头、响应正文。如下所示,HTTP响应的格式与请求的格式十分类似:
<状态行>
<响应报文header>
<空行>
[响应报文内容]
正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由3位数字组成,第一个数字定义了响应的类别,且有5种可能取值,如表所示:

取值范围含义
100~199指示信息-表示请求已经接收,继续处理
200~299请求成功。表示请求已被成功接收、理解、接收
300~399重定向。要完成请求必须进行更进一步的操作
400~499客户端错误。请求有语法错误或请求无法实现
500~599服务器端错误。服务器未能实现合法的请求

常见状态码、状态描述说明如下:
(1)200 OK:客户端请求成功
(2)400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
(3)401 Unauthorized:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用。
(4)403 Forbidden:服务器收到请求,但是拒绝提供服务。
(5)404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
(6)500 Internal Server Error:服务器发生不可预期的错误。
(7)503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK (CRLF)。
例如,这是一个GET请求的Response返回示例:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=
Content-Length: 122

<html>
  <head>
    <title>示例</title>
  </head>
  <body>
    <!--这里是Body-->
  </body>
</html>

该请求返回码为200,表示请求成功。返回的数据类型为text/html,编码为ISO-8859-1,内容长度为122。在一个空行之后就是返回的数据,也就是一个html页面。客户端接收到这个返回结果之后,直接将结果展示在WebView上即可。如果返回的是Json、XML格式的数据,那么我们通常需要解析这些数据,并且将根据结果进行其他相应的处理。

4.1.2.2.常见的请求头

请求头由键值对组成,每行一对,关键字和值用英文冒号“:”分隔。HTTP规范定义了几种首部字段,应用程序也可以随意发明自己所用的首部。HTTP首部可以分为一下几类,如表所示:

首部类型作用
通用首部既可以出现在请求报文中,也可以出现在响应报文中
请求首部提供更多有关请求的信息
响应首部提供更多有关响应的信息
实体首部描述主体的长度和内容,或者资源自身
扩展首部HTTP规范中没有定义的新首部

请求头部通知服务器关于客户端请求的信息,典型的请求头有。
(1)Content-Type:请求数据的格式。
(2)Content-Length:消息长度
(3)Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
(4)User-Agent:发出请求的浏览器类型,可以自行设置
(5)Accept:客户端可识别的内容类型列表
(6)Accept-Encoding:客户端可识别的数据编码
(7)Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如,设置为Keep-Alive则表示保持连接
(8)Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

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

4.1.2.HTTP报文格式解析 的相关文章

随机推荐

  • 在Source Insight中添加对.cc的支持

    Options gt Document Options Document Type gt 下拉选择 xff1a C 43 43 Source File 在File Filter 中加入 cc
  • Android HFP流程记录

    DP 完成后 xff0c btif dm c文件中 xff0c btif dm search services evt函数 xff0c bond state changed BT STATUS SUCCESS amp bd addr BT
  • OPP文件传输

    在RFCOMM连接后 xff0c 进行Command Type Parameter Negotiation时 xff0c 会协商Credits初始值 建立OBEX连接时 xff0c 会将poll bit设置 xff0c 用于Given Cr
  • 算法——欧几里得算法

    目录 欧几里得算法算法原理欧几里得算法的代码表示 参考文献 欧几里得算法 欧几里得算法是用来求两个正整数最大公约数的算法 古希腊数学家欧几里得在其著作中 The Elements 中最早描述了这种算法 xff0c 所以叫欧几里得算法 a s
  • 算法——100瓶水,一瓶有毒,有一种试纸...

    问题描述 100瓶水 xff0c 一瓶有毒 xff0c 有一种试纸 xff0c 不过需要一个小时才能出结果 xff0c 问最少需要几片试纸才能在一小时内找到有毒的那一瓶 答案 span class token number 7 span 算
  • 基于muduo网络库的集群聊天系统(C++实现)

    文章目录 项目概述业务流程 数据模块表的设计数据库模块设计 通信格式网络和业务模块网络模块网络模块和业务模块解耦合业务模块注册业务登录业务加好友业务一对一聊天业务创建群业务加入群业务群聊业务注销业务 服务器集群跨服务器通信集群聊天服务器的思
  • linux设备驱动原理与本质

    任何计算机系统都是软件和硬件的结合体 xff0c 如果只有硬件而没有软件 xff0c 则硬件是没有灵魂的躯壳 xff1b 如果只有软件没有硬件 xff0c 则软件就是一堆无用的字符 在底层硬件的基础上 xff0c 操作系统覆盖一层驱动 xf
  • pycharm配置可视化界面流程简介

    一 安装QT Designer 在pycharm的终端里面输入如下命令 span class token comment 安装pyqt5 span pip install PyQt5 span class token comment 安装p
  • 内存——CPU、内存以及磁盘是如何交互的

    文章目录 内存的存储SRAMDRAMDRAM内部以及与内存控制模块的交互 xff08 重点 xff09 DRAM与内存存储CPU和内存的交互 xff08 重点 xff09 磁盘磁盘和CPU 内存的交互 局部性参考文献 之前在介绍linux
  • libco —— 安装与使用

    文章目录 libco的安装libco库的简单使用参考文献 libco的安装 可以直接从 Tencent 的 GitHub 仓库中拉取源码 xff1a ubuntu 64 VM 0 2 ubuntu libco span class toke
  • 为什么我的云服务器不能绑定公网 ip ?

    文章目录 云服务器的部署 xff1a 数据中心NAT协议开头问题的答案参考文献 写在前面 昨天呢 xff0c 在校招群里的小伙伴问了我们一个问题 xff0c 让我们帮给看看 xff1a 一开始呢 xff0c 博主按照经验呢跟他说是端口号被占
  • 汇编 —— 算术和逻辑操作

    文章目录 加载有效地址leaq 练习题练习题答案 一元操作符 amp 二元操作符一元 amp 二元 练习题练习题答案 移位操作移位练习题练习题答案 特殊的算数操作符练习题练习题答案 参考文献 写在前面 xff1a 从腾讯实习回来之后 xff
  • clang-format安装配置与vscode支持

    文章目录 calng format安装centos下clang format安装ubuntu下clang format的安装vscode支持clang format clang format使用参考文献 calng format安装 cen
  • 分布式共识算法 —— Raft详解

    文章目录 分布式共识算法顺序一致性线性一致性因果一致性 Raft 算法原理概览选举机制新节点加入leader 掉线处理多个 follower 同时掉线 日志复制 参考文献 分布式共识算法 首先我们先明确这个问题 xff1a 为什么需要分布式
  • container_of 根据成员变量获得包含其的对象的地址!

    写在前面 本系列文章的灵感出处均是各个技术书籍的读后感 xff0c 详细书籍信息见文章最后的参考文献 CONTAINER OF 在书中发现一个很有意思的宏 xff0c 以此可以衍生出来其很多的用法 xff0c 这个宏可以根据某个成员变量的地
  • Linux 内核观测技术BPF

    BPF简介 BPF xff0c 全称是Berkeley Packet Filter xff08 伯克利数据包过滤器 xff09 的缩写 其诞生于1992年 xff0c 最初的目的是提升网络包过滤工具的性能 后面 xff0c 随着这个工具重新
  • bpftrace 指南

    文章目录 0 bpftrace0 1 bpftrace组件0 2 bpftrace 帮助信息0 3 bpftrace 工具速览表0 4 bpftrace 探针0 4 1 tracepoint0 4 2 usdt0 4 3 kprobe和kr
  • make px4_sitl_default gazebo编译报错解决办法

    PX4无人机ROS下仿真 xff0c 下载Fireware后执行make px4 sitl default gazebo编译 xff0c 编译过程中出现如下错误 xff1a 错误原因是两个package没有安装 xff1a gstreame
  • 理解实时操作系统与裸机的区别

    早期嵌入式开发没有嵌入式操作系统的概念 xff0c 直接操作裸机 xff0c 在裸机上写程序 xff0c 比如用51单片机基本就没有操作系统的概念 通常把程序分为两部分 xff1a 前台系统和后台系统 简单的小系统通常是前后台系统 xff0
  • 4.1.2.HTTP报文格式解析

    不同的请求方式 xff0c 他们的请求格式可能是不一样的 xff0c 请求格式就是我们所说的的报文格式 但是 xff0c 通常来说一个HTTP请求报文由请求行 xff08 request line xff09 请求头 xff08 heade