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报文格式解析 的相关文章

  • 使用 Servlet 启动 VLC HTTP Stream 时出现问题

    我正在为自己开发一个 VLC 项目 我的目标是创建一个 HTML 前端来启动流 我通过使用 Java Servlet 来完成此操作 概述 乌班图13 04 Java 7 21 冰茶 2 3 9 Eclipse JAVAEE IDE 雄猫7
  • REST DELETE 真的是幂等的吗?

    DELETE 应该是幂等的 如果我删除http example com account 123 http example com account 123它将删除该帐户 如果我再次这样做 我会收到 404 错误吗 因为该帐户已不存在 如果我尝
  • 如何从一个端口为 Jetty 提供 https 和 http 服务?

    我知道这是一个重复的问题 但原始发帖者提出这个问题的原因是错误的 我并不是暗示我问它是为了right原因 但让我们看看 我们有一个在非标准端口号上运行的 Web 服务 尽管用户似乎能够记住端口号 但有时他们会错误地输入 http 而不是 h
  • HttpURLConnection (java.net.CookieManager) 和 WebView (android.webkit.CookieManager) 之间的 cookie 双向同步

    不幸的是 Android 有很多 cookie 管理器 饼干为HttpURLConnection由以下人员维护java net CookieManager和饼干WebView由以下人员维护android webkit CookieManag
  • 在 C# 中的 RESTfull/HTTP 请求中添加标头和发布数据

    我在 C 中发送 POST 请求时遇到问题 似乎我误解了一些 HTTP 基础知识 所以基本上我正在实施 RESTfull 服务client 其工作原理如下 使用用户名 密码发出 POST 请求并获取令牌 在发出其他 GET POST PUT
  • 如何在我的 gstreamer 中启用 httpsrc 插件?

    我尝试使用以下命令播放通过 http 检索的 mp3 文件或流 gst launch httpsrc location http domain com music mp3 mad osssink 但出现以下错误 ERREUR le pipe
  • 创建 JSON 对象并将其转换为 Java 中的 String

    我需要通过 http post 发送一个相当长的 JSON 标头 在Python中是这样的 self body header client self client name clientRevision self client versio
  • IE 下的 Http 请求速度变慢

    在我的 javascript 应用程序中工作时 我注意到使用 IE 11 时 相同的 ajax 请求时间最多延长 10 倍 响应大小完全相同 12 6KB 我看到的唯一区别是 IE 添加 Pragma no cache 不是铬 Chrome
  • 使用 php 和 jquery 的简单彗星示例

    谁能给我一个使用 PHP 的彗星技术的简单好例子 我只需要一个使用持久 HTTP 连接或类似连接的示例 我不想使用轮询技术 因为我已经设置了类似的东西 并且不仅难以使用和管理它的大量资源 另外我使用的是 IIS7 而不是 Apache 一个
  • 在获得响应之前发出多个请求

    当并行发送多个请求时 在获得响应之前 我无法理解 HTTP 的工作原理 有两种情况 1 With Connection Keep Alive 根据HTTP规范 http www w3 org Protocols rfc2616 rfc261
  • 我应该使用哪种协议来传输音频(非直播)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用创建的 201 进行重定向

    有没有办法通过 201 答案重定向 RFC规定新创建的资源必须在Location标题 我确实指定了它 我假设浏览器会重定向 但事实并非如此 即使页面没有内容 我希望用户在 POST 操作之后重定向到新资源 因此我很想使用303 See Ot
  • 在电子邮件中使用协议相对 URL 安全吗?

    关于在 HTML 中使用协议相对 URL 已有讨论 1 但是电子邮件呢 电子邮件客户端或 Gmail 等服务提供商在 HTML 电子邮件中使用时是否会删除或修改协议相对 URL 1 我可以将所有 http 链接更改为 吗 https sta
  • Angular 显示每个 HTTP 请求的微调器,只需很少的代码更改

    我正在开发一个现有的 Angular 应用程序 版本是 Angular 4 该应用程序从许多不同的组件对 REST API 进行 HTTP 调用 我想为每个 HTTP 请求显示一个自定义微调器 由于这是一个现有的应用程序 因此有很多地方调用
  • 如何使用 Apache HttpClient 4 获取文件上传的进度条?

    我有以下用于使用 Apache 的 HTTP Client org apache http client 上传文件的代码 public static void main String args throws Exception String
  • 把自己限制在HTTP1.0有什么用吗?

    我负责构建一些工具来帮助最终用户测试为什么他们的浏览器可能无法与网站配合使用 我被告知它可能不起作用的原因之一是 需要 HTTP1 1 这一行 我浏览了大多数浏览器选项 只浏览了 IE 版本 6 及更高版本 even 9 允许您禁用 HTT
  • Node.js 中的 HTTPS 代理服务器

    我正在开发一个node js代理服务器应用程序 我希望它支持HTTP and HTTPS SSL 协议 作为服务器 我目前正在使用node http proxy https github com nodejitsu node http pr
  • 如何从 Kubernetes 服务背后的 HTTP 请求读取客户端 IP 地址?

    我的 Web 应用程序作为 Kubernetes pod 在 SSL 的 nginx 反向代理后面运行 代理和我的应用程序都使用 Kubernetes 服务进行负载平衡 如所述here http blog kubernetes io 201
  • 如何让 NSURLRequest 获取 Twitter 请求令牌?

    我正在尝试使用以下代码从 Twitter 获取请求令牌 NSMutableURLRequest mURLRequest NSMutableURLRequest alloc initWithURL NSURL URLWithString ht
  • AWS ALB 截断 HTTP 响应

    我有一个带有目标组的 ALB 和运行 PHP API 的 ECS 集群 我正在尝试查询 API 以获得 CSV 响应 但如果请求通过 ALB 我会得到被截断的结果 当我通过 SSH 连接到运行集群的 EC2 实例并尝试手动运行curl 通过

随机推荐

  • 架构漫谈(八):从架构的角度看如何写好代码 + 我的思考

    我的总结 xff1a 当先前对于利益相关者的关系理清了 xff0c 系统基本架构和测试方法等也有了 xff0c 进入实际Coding阶段 在Coding前 xff0c 需要我们考虑好业务功能的分配 xff0c 关注于功能会频繁变更的部分 x
  • 插头类型:MX 1.25 PH间距2.0、XH间距2.5/2.54、VH间距3.96区别?

    PH xff0c XH xff0c ZH等这些都是JST xff08 Japan Standard Time 日本压着端子制造株式会社 xff09 的料号 xff0c 因为JST用的最多 xff0c 且很多工厂都在模仿制作 xff0c 故也
  • 树莓派NAS搭建——基于OMV

    之前树莓派的debian版系统里装了个以samba服务为基础的NAS xff0c 但在实际使用中发现写入速度只有2M s xff0c 特别慢 xff0c 用的是Class 10的高速TF卡也于事无补 实在无法直视 xff0c 于是一直在搜寻
  • 最短路径算法——Dijkstra介绍

    个人心得体会 xff1a 理解这种或这类算法 xff0c 可以先从小规模的问题入手 xff0c 并逐渐推广到问题变复杂的情况 xff0c 这样理解起来也可以更方便和透彻 和数学归纳法很相似 图简介 以使用地图APP为例 xff0c 假设你想
  • net framework4.0未能成功安装、另一个安装操作正在进行、请继续这个操作之前完成那个操作。

    转自百度 安装net framework 4 0出错的解决方法 步骤 xff1a 开始 运行 xff08 输入CMD xff09 确定或者回车 xff0c 打开管理员命令窗口 xff1b 在管理员命令窗口输入 xff1a net stop
  • java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver

    第一次写jsp xff0c 用jdbc连接数据库进行查询的时候 xff0c Class forName 34 com microsoft jdbc sqlserver SQLServerDriver 34 newInstance conn
  • numpy Array [: ,] 的取值方法

    numpy Array 的取值方法 NumPy数组是一个多维数组对象 xff0c 称为ndarray 创建一个numpy数组 如下所示 span class token keyword import span numpy span clas
  • 如何安装windows和linux双系统

    最近装了两天系统积攒了一下经验 原本一直使用win7 xff0c 现需要使用linux操作系统作为开发环境 xff0c 虚拟机的能力总是有限 xff0c 所以打算装双系统 xff0c 装系统以前一直对我来说一直很神秘 xff0c 为什么系统
  • sed -i命令详解

    sed i命令详解 root 64 www sed nefr 动作 选项与参数 xff1a n xff1a 使用安静 silent 模式 在一般 sed 的用法中 xff0c 所有来自 STDIN 的数据一般都会被列出到终端上 但如果加上
  • 模拟信号和数字信号的区别

    作者 xff1a 杨眀 链接 xff1a https www zhihu com question 38377832 answer 118464689 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业
  • 于渊《orange's 一个操作系统实现》的字符串输出函数disp_str有bug会导致异常

    于渊先生的 orange s 一个操作系统实现 的字符串输出函数disp str有bug会导致异常 发现在同一个函数中两次使用disp str就会导致异常 xff0c 这个问题困扰了我很久 xff0c 一般来说都是堆栈的没有恢复好的问题 x
  • 基于CMake导入第三方库,以OpenCV为例

    基于CMake导入第三方库 xff0c 以OpenCV为例 目录 基于CMake导入第三方库 xff0c 以OpenCV为例前言直接导入find package基于nuget进行包管理运行的问题 前言 除了自己写一个静态库或动态库 xff0
  • 进程是如何结束与回收的

    大致描述进程创建的过程 xff0c 系统中有一个叫做init的初始进程 xff0c 由它调用fork产生子进程 完全拷贝父进程的一切堆栈 xff0c 代码 xff0c 数据 xff0c 文件资源等 xff0c 子进程使用exec装载磁盘中的
  • 今天安装spring的时候遇到一些缺少repository的问题

    在安装spring的时候会对其依赖的一些库的进行一些链接检查 xff0c 导致会报一些缺少repository的问题 No repository found containing osgi bundle oracle eclipse too
  • 什么是maven

    maven是一种项目管理工具 xff0c maven项目与普通项目的不同是 xff0c 项目中多了一个pom xml的文件 xff0c 用于告诉当前项目所需要的jar的位置 xff0c 从而无须手动将需要用到的jar包引入
  • 串口实用的循环缓冲区

    小记 项目临时需要单片机进行节点控制 xff0c 主要用来控制模块的开关 xff0c 以串口进行通讯 单片机几多久没玩了 xff0c 选用的是C8051F920 xff0c 传说中增强型51 xff0c 不过看了Datesheet 还是51
  • C++学习:编译

    编译 为了编译 C 43 43 程序 xff0c 我们使用 C 43 43 编译器 C 43 43 编译器按顺序遍历程序中的每个源代码 cpp 文件 它会检查您的代码以确保它遵循 C 43 43 语言的规则 如果没有 xff0c 编译器会给
  • 堆、栈、方法区存储的变量的类型

    1 堆 xff08 Heap xff09 xff0c 此内存区域的唯一目的就是存放对象实例 xff0c 几乎所有的对象实例都在这里分配内存 这一点在 Java 虚拟机规范中的描述是 xff1a 所有的对象实例以及数组都要在堆上分配 2 通常
  • stm32串口中断的接收

    利用串口使得led点亮 利用之前的串口函数加上NVIC的中断函数结构体 定义结构体 定义 配置抢占优先级的组别 配置NVIC串口中断的结构体 xff1a 中断的通道 xff0c 配置抢占优先级和子优先级 使能CMD 结构体初始化 还有需要配
  • 4.1.2.HTTP报文格式解析

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